为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪9158850 2019-06-25 17:22:40
如何将有效的罗马数字与正则表达式匹配?思考我的另一个问题,我决定我甚至不能创建一个与罗马数字相匹配的正则表达式(更不用说生成它们的上下文无关语法了)。问题是只匹配有效的罗马数字。990不是“XM”,而是“CMXC”我在做这个正则表达式时的问题是,为了允许或不允许某些字符,我需要回顾一下。例如,让我们以成千上万的人为例。我可以允许M{0,2}?m(允许900,1000,1900,2000,2900和3000)。但是,如果匹配在CM上,我不能允许下面的字符是C或D(因为我已经在900了)。我该如何用regex来表达这一点呢?如果它在正则表达式中是不可表达的,那么它是否可以用上下文无关的语法来表示呢?
查看完整描述

3 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

为了避免匹配空字符串,您需要重复该模式四次并替换每个0带着1反过来,并说明VLD:

(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..但是我仍然对一些有效的词有疑问,比如Tahitifantastic被擦洗成Tahitfantasti.


查看完整回答
反对 回复 2019-06-25
  • 3 回答
  • 0 关注
  • 2107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信