我试图防止包含后缀名,例如JR
/ SR
或其他使用正则表达式方式使用I,V,X
组成的后缀。为此,我实现了以下正则表达式
((^((?!((\b((I+))\b)|(\b(V+)\b)|(\b(X+)\b)|\b(IV)\b|(\b(V?I){1,2}\b)|(\b(IX)\b)|(\bX[I|IX]{1,2}\b)|(\bX|X+[V|VI]{1,2}\b)|(\b(JR)\b)|(\b(SR)\b))).)*$))
使用此方法,我可以防止各种可能的组合,例如, “我的姓氏”, “姓氏II”, “姓氏IJR”, “姓氏SRX”等
但是,仍然剩余几个组合,此正则表达式可以匹配。例如“姓氏IXV”或“姓氏VXI”
这两个我无法调试。请建议我可以在此正则表达式的哪一部分进行更改以满足要求。
谢谢!
答案 0 :(得分:2)
尝试以下模式:.+\b(?:(?>[JS]R)|X|I|J|V)+$
说明:
.+
-匹配任意一个或多个字符
\b
-单词boudnary
(?:...)
-非捕获组
(?>...)
-原子团
[JS]R
-匹配S
或J
后跟R
|
-交替:匹配左侧的内容或右侧的内容
+
-量词:比模式前匹配一或多次
$
-匹配字符串的结尾
答案 1 :(得分:0)
为了解决这个问题,我在上面的正则表达式上做了更多的工作。这是最终结果,可以成功地与多达三十个由I,V和X组成的“罗马数字”相匹配。
"(\b(?!(IIX|IIV|IVV|IXX|IXI))I[IVX]{0,3}\b|\b(V|X)\b|\bV[I]{1,2}\b|\b((?!XVV|XVX)X([IXV]{1,2}))\b|\b[S|J]R\b)|^$"
我在这里所做的是:
我已经考虑了这些独立输入的内容,
即:SR
或XXV
我观察到错误的模式,并且
限制了它们匹配的积极性。
\b
单词边界确保了单独的输入。 单词边界:它表明单词的开头,这意味着 简单的单词说“是,有一个词”或“没有,不是。”
(?!(IIX|IIV|IVV|IXX|IXI))
我如何提出此解决方案的方法如下:
我首先仔细观察了从I到X的所有模式,即:
我们在第一个位置有一个I,V和X。然后还有另一个I,X和V 在第二个位置。之后,我和V再次相同 在上面编写的代码的以下正则表达式中实现了这一点:
\b(?!(IIX|IIV|IVV|IXX|IXI))I[IVX]{0,3}\b
以I开头,然后查找“ 0”至“三个”字符范围内的I,V或X,并忽略写在?!(IIX|IIV|IVV|IXX|IXI)
内的无效数字,我已经完成了下面给出的其他组合。
然后针对V和X:\b(V|X)\b
然后是VI,VII:\bV[I]{1,2}\b
然后是XI-XXX:\b((?!XVV|XVX)X([IXV]{1,2}))\b
要验证后缀名,即JR
,SR
,可以使用以下正则表达式:\b[S|J]R\b
,最后一个(^ $)用于匹配空白字符串,或者换句话说,当没有为给定的input-box
或textbox
提供输入时。
如果有的话,您可以发表任何问题或建议。
谢谢!
Ps:此正则表达式只是使用I,V和X验证从1到30的“罗马数字”的一种解决方案。我希望它对每个正则表达式的新手都有帮助。