有一篇非常有用的文章介绍如何验证罗马数字How do you match only valid roman numerals with a regular expression?
尽管我付出了很多努力,但正则表达一直是我的致命弱点。如何扩展提供的正则表达式以匹配normal
整数?提供的正则表达式为:
/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/
答案 0 :(得分:3)
假设您只需要常规形式的十进制整数(例如,1000
有效,1e3
[科学记数法中的相同数字]不会),正则表达式,用于验证\d+
,表示"一个或多个数字。"
要让正则表达式允许,您需要替换,这可以让两个选项中的任何一个匹配。替代品的格式为first|second
,其中first
和second
是替代品。
因为你当前的表达式有"开头"和"结束"在输入断言(^
和$
)中,我们要么想要包含第二个备选方案中的那些,要么将整个交替置于非捕获组中。
所以:
/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$|^\d+$/
// Note -----------------------------------------------------^^^^^^
或
/^(?:M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})|\d+)$/
// ^^^ ^^^^^
请注意,您的原始表达式有一些捕获组(但不完全由捕获组成);如果你想捕获 \d+
部分,你可以在其周围放置()
。