正则表达式无法阻止使用I,V,X和SR / JR组成的后缀名称匹配

时间:2019-04-29 06:03:14

标签: regex regex-lookarounds

我试图防止包含后缀名,例如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”

这两个我无法调试。请建议我可以在此正则表达式的哪一部分进行更改以满足要求。

谢谢!

2 个答案:

答案 0 :(得分:2)

尝试以下模式:.+\b(?:(?>[JS]R)|X|I|J|V)+$

说明:

.+-匹配任意一个或多个字符

\b-单词boudnary

(?:...)-非捕获组

(?>...)-原子团

[JS]R-匹配SJ后跟R

|-交替:匹配左侧的内容或右侧的内容

+-量词:比模式前匹配一或多次

$-匹配字符串的结尾

Demo

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


我在这里所做的是:

  • 我已经考虑了这些独立输入的内容, 即:SRXXV我观察到错误的模式,并且 限制了它们匹配的积极性。

    • 已使用\b单词边界确保了单独的输入。
  

单词边界:它表明单词的开头,这意味着   简单的单词说“是,有一个词”或“没有,不是。”

  • 它通过以下方式完成- 使用负前瞻(?!(IIX|IIV|IVV|IXX|IXI))

我如何提出此解决方案的方法如下:

  • 我首先仔细观察了从I到X的所有模式,即:

    • 我我
    • 我我我
    • 我V
    • V
    • 我我
    • V I I I(超出3个字符的范围。)
    • 我X
    • 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

  • 要验证后缀名,即JRSR,可以使用以下正则表达式:\b[S|J]R\b

  • ,最后一个(^ $)用于匹配空白字符串,或者换句话说,当没有为给定的input-boxtextbox提供输入时。

如果有的话,您可以发表任何问题或建议。

谢谢!

Ps:此正则表达式只是使用I,V和X验证从1到30的“罗马数字”的一种解决方案。我希望它对每个正则表达式的新手都有帮助。