Regex 正则表达式仅匹配0-39之间的罗马数字

Regex 正则表达式仅匹配0-39之间的罗马数字,regex,Regex,我正在尝试编写一个正则表达式,它只匹配0到39之间的罗马数字。有很多例子匹配更大的罗马数字,但我不知道如何匹配这个特定的子集。明白了。试试这个: /^(X{1,3})(I[XV]|V?I{0,3})$|^(I[XV]|V?I{1,3})$|^V$/ 更新: 罗马数字中的零。因此,请随意添加您自己的零实现。我不确定如何使用罗马数字表示0。我假设它有单独的令牌N(请参阅) 假设正则表达式尝试匹配整个字符串(如Java中),并且您已经匹配了,那么您可以使用以下正则表达式: (?.)(X{0,3}(I

我正在尝试编写一个正则表达式,它只匹配0到39之间的罗马数字。有很多例子匹配更大的罗马数字,但我不知道如何匹配这个特定的子集。

明白了。试试这个:

/^(X{1,3})(I[XV]|V?I{0,3})$|^(I[XV]|V?I{1,3})$|^V$/
更新:
罗马数字中的零。因此,请随意添加您自己的零实现。

我不确定如何使用罗马数字表示0。我假设它有单独的令牌
N
(请参阅)

假设正则表达式尝试匹配整个字符串(如Java中),并且您已经匹配了,那么您可以使用以下正则表达式:

(?.)(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})

因为前一个正则表达式中的lookahead和
N
只是为了防止空字符串。

假设您知道您有有效的罗马数字,并且只想获取40添加的新字符?可能更容易匹配所有罗马数字,并让代码的其他部分解析出0到39。当然,如果你有这个选项的话。40添加了新的字符L。@timolawl我没有这个选项:/因为所有小于40的数字都只使用字符I、V和X,所有大于或等于40的数字都至少有一个额外的字符,你应该能够写一个正则表达式来匹配只有I的数字,一般来说,我认为复制匹配是不好的(例如,席可以匹配第一个或第二个替代)。您可以更新第二部分,使其不以X开头。@justhalf Good catch。您应该放置
锚定
或单词边界,否则它将接受
iiii
它匹配X,我已经说过,我假设它尝试匹配整个字符串=)(哦,是的,第一个不匹配)
X{0,3}
中的0是unnecessary@rock321987:是的,修好了。
^[XVI]*$
^X{0,3}(?:V?I{0,3}|I[VX])$