我试图阻止包含后缀名,例如,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))).)*$))
使用这个,我可以防止各种可能的组合,例如,'姓氏一','姓氏二','姓氏IJR','姓氏SRX'等。
然而,仍然有几个组合剩余,这个正则表达式可以匹配。例如,'姓氏IXV'或'姓氏VXI'
这两个我不能调试。请建议我在这个正则表达式的哪一部分,我可以作出改变,以满足要求。
谢谢大家!
3条答案
按热度按时间nqwrtyyt1#
尝试以下模式:
.+\b(?:(?>[JS]R)|X|I|J|V)+$
说明:
.+
-匹配一个或多个任意字符\b
字边界(?:...)
-非捕获组(?>...)
-原子团[JS]R
-匹配是S
还是J
后跟R
|
-交替:匹配左边的还是右边的+
-量词:匹配一个或多个先前模式$
-匹配字符串结尾Demo
but5z9lq2#
为了解决这个问题,我在上面的正则表达式上做了一些工作。这里是最终的结果,它可以成功地匹配由I,V和X组成的30个"罗马数字"。
"(\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,V,和X。然后在第二个位置有另一个I,X和V。然后再是相同的I和V。我在上面写的代码的下面的正则表达式中实现了这个:
\b(?!(IIX|IIV|IVV|IXX|IXI))I[IVX]{0,3}\b
?!(IIX|IIV|IVV|IXX|IXI)
中的无效数字。类似地,我也处理了下面给出的其他组合。\b(V|X)\b
\bV[I]{1,2}\b
\b((?!XVV|XVX)X([IXV]{1,2}))\b
JR
,SR
,可以使用以下正则表达式:\b[S|J]R\b
input-box
或textbox
时。您可以张贴任何问题或建议,如果你有.
谢谢!
附言:这个正则表达式只是一个使用I、V和X验证从1到30的"罗马数字"的解决方案。我希望它能帮助每一个正则表达式的新手学习一点。
t2a7ltrp3#
我用更明确的方式解决了这个问题:
我知道我可以做一些像[JS]R,但我喜欢这样读:
(.+)
匹配任意字符,然后匹配空格(?:(?>JR$|SR$|I$|II$|III$|IV$|MD$|DO$|PHD$))
自动查找但不匹配JR等结尾|(.+)
如果找不到结尾,则匹配任意字符请随意添加您想要的结局以满足您的需要。