我正在尝试编写一个仅与0到39的罗马数字匹配的正则表达式。有很多例子与更大的罗马数字相匹配,但我无法弄清楚如何匹配这个特定的子集。
答案 0 :(得分:1)
知道了。试试这个:
/^(X{1,3})(I[XV]|V?I{0,3})$|^(I[XV]|V?I{1,3})$|^V$/
罗马数字为零doesn't exist。因此,您可以随意将自己的实现归结为零。
答案 1 :(得分:1)
我不确定如何使用罗马数字表示0。我假设它有单独的令牌N
(请参阅Wikipedia)。
假设正则表达式试图匹配整个字符串(就像在Java中一样)并且你有lookahead,你可以使用这个正则表达式:
(?.)(X{0,3}(IX|IV|V?I{0,3})|N)
说明:
(?.)
:确保至少有一个字符X{0,3}
:定义十(0,10,20,30)(...)
:定义最后一位数字IX
:9 IV
:4 V?I{0,3}
:0-3,5-8(0不是整数,至少需要一个X
)N
:0(整数)如果将0表示为空字符串,则正则表达式更简单:
X{0,3}(IX|IV|V?I{0,3})
因为前一个正则表达式中的前瞻和N
只是为了防止空字符串。
答案 2 :(得分:0)
假设您知道自己拥有有效的罗马数字,并且只想获取< = 39,那很容易:
^[XVI]*$
如果情况并非如此,那就有点棘手了,但你仍然可以利用所有数字只能用X
,V
和{{1来表示这一事实是1..39:
I
^X{0,3}(?:V?I{0,3}|I[VX])$
涵盖10,20,30 X{0,3}
涵盖了以4或9结尾的所有内容(14,29等)X{0,3}V?I{0,3}
正好以4或9 注意:这些也会匹配一个空字符串,这是我对罗马零点的解释。如果不是这种情况,您可以将X{0,3}I[VX]
替换为*
作为第一个正则表达式,并在正则表达式的开头为第二个正则表达式添加正向前瞻(+
)。
注意2 :如果它们不在单独的行(或单独的字符串中),则可以将(?=.)
和^
替换为word boundaries({{ 1}})。