如何将有效的罗马数字与正则表达式匹配?

如何将有效的罗马数字与正则表达式匹配?

思考我的另一个问题,我决定我甚至不能创建一个与罗马数字相匹配的正则表达式(更不用说生成它们的上下文无关语法了)。

问题是只匹配有效的罗马数字。990不是“XM”,而是“CMXC”

我在做这个正则表达式时的问题是,为了允许或不允许某些字符,我需要回顾一下。例如,让我们以成千上万的人为例。

我可以允许M{0,2}?m(允许900,1000,1900,2000,2900和3000)。但是,如果匹配在CM上,我不能允许下面的字符是C或D(因为我已经在900了)。

我该如何用regex来表达这一点呢?
如果它在正则表达式中是不可表达的,那么它是否可以用上下文无关的语法来表示呢?


慕田峪9158850
浏览 2110回答 3
3回答

繁星淼淼

为了避免匹配空字符串,您需要重复该模式四次并替换每个0带着1反过来,并说明V, L和D:(M{1,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|C?D|D?C{1,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|X?L|L?X{1,3})(IX|IV|V?I{0,3})|M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|I?V|V?I{1,3}))在这种情况下(因为此模式使用^和$)你最好先检查空行,不要麻烦地匹配它们。如果你用字界那你就没有问题了,因为没有空话这回事。(至少regex没有定义一个;不要开始哲学,我在这里是务实的!)在我自己特定的(现实世界)情况下,我需要词尾匹配的数字,而我找不到其他方法。我需要删除我的纯文本文档中的脚注号,比如“红海”克莱大堡礁克莱“已改为the Red Seacl and the Great Barrier Reefcli..但是我仍然对一些有效的词有疑问,比如Tahiti和fantastic被擦洗成Tahit和fantasti.
打开App,查看更多内容
随时随地看视频慕课网APP