正则表达式匹配罗马数字0-39只

时间:2016-04-14 02:29:44

标签: regex

我正在尝试编写一个仅与0到39的罗马数字匹配的正则表达式。有很多例子与更大的罗马数字相匹配,但我无法弄清楚如何匹配这个特定的子集。

3 个答案:

答案 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]*$

See it in action

如果情况并非如此,那就有点棘手了,但你仍然可以利用所有数字只能用XV和{{1来表示这一事实是1..39:

I

See it in action

  • ^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}})。