Regex无法防止匹配使用I、V、X和SR/JR组成的后缀名

w8f9ii69  于 2023-02-17  发布在  其他
关注(0)|答案(3)|浏览(327)

我试图阻止包含后缀名,例如,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'
这两个我不能调试。请建议我在这个正则表达式的哪一部分,我可以作出改变,以满足要求。
谢谢大家!

nqwrtyyt

nqwrtyyt1#

尝试以下模式:.+\b(?:(?>[JS]R)|X|I|J|V)+$
说明:
.+-匹配一个或多个任意字符
\b字边界
(?:...)-非捕获组
(?>...)-原子团
[JS]R-匹配是S还是J后跟R
|-交替:匹配左边的还是右边的
+-量词:匹配一个或多个先前模式
$-匹配字符串结尾
Demo

but5z9lq

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)|^$"

    • 我所做的是:**
  • 我已经考虑了那些独立的输入,即:SRXXV我已观察到不正确的模式,并限制它们匹配为阳性结果。
  • 使用\b字边界确保单独输入。
  • 单词边界:* 它表示一个单词的开头,这意味着在简单的话,它说"是有一个单词"或"不,它不是"。
  • 它是以如下方式完成的使用负前视(?!(IIX|IIV|IVV|IXX|IXI))
    • 我是如何得出此解决方案的,如下所示:**
  • 我首先仔细观察了所有的模式,即从I到X--也就是说:
  • 我我
  • 我我
  • 一、五
  • 第五章
  • 五、一、一
  • V I I I(超出3个字符的范围。)
  • 一X

我们在第一个位置有一个I,V,和X。然后在第二个位置有另一个I,X和V。然后再是相同的I和V。我在上面写的代码的下面的正则表达式中实现了这个:
\b(?!(IIX|IIV|IVV|IXX|IXI))I[IVX]{0,3}\b

  • 从I开始,然后在"0"到"3"字符范围内查找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
  • 要验证后缀名,例如JRSR,可以使用以下正则表达式:\b[S|J]R\b
  • 最后一个(^$)用于匹配空字符串,或者换句话说,当没有输入提供给给定的input-boxtextbox时。

您可以张贴任何问题或建议,如果你有.
谢谢!
附言:这个正则表达式只是一个使用I、V和X验证从1到30的"罗马数字"的解决方案。我希望它能帮助每一个正则表达式的新手学习一点。

t2a7ltrp

t2a7ltrp3#

我用更明确的方式解决了这个问题:

(.+) (?:(?>JR$|SR$|I$|II$|III$|IV$|MD$|DO$|PHD$))|(.+)

我知道我可以做一些像[JS]R,但我喜欢这样读:
(.+)匹配任意字符,然后匹配空格
(?:(?>JR$|SR$|I$|II$|III$|IV$|MD$|DO$|PHD$))自动查找但不匹配JR等结尾
|(.+)如果找不到结尾,则匹配任意字符
请随意添加您想要的结局以满足您的需要。

相关问题