Ruby regexp应排除;125af“;子串

Ruby regexp应排除;125af“;子串,ruby,regex,Ruby,Regex,我有以下regexp: /^(\d{1,11})((?:(?:c?o|co?).*)?.*)$/i 匹配字符串,如: 125******* or 125co****** or 125CO******* 我想排除以以下开头的子字符串: 125af***** or 125AF****** or 125f****** or 125AF******** 提前感谢试试这个 ^(?>\d{1,11})(?!af|a|f)((?:(?:c?o|co?).*)?.*)$ 看到了吗 我对您的正则表达

我有以下regexp:

/^(\d{1,11})((?:(?:c?o|co?).*)?.*)$/i
匹配字符串,如:

125******* or 125co****** or 125CO*******
我想排除以以下开头的子字符串:

125af***** or 125AF****** or 125f****** or 125AF********
提前感谢

试试这个

^(?>\d{1,11})(?!af|a|f)((?:(?:c?o|co?).*)?.*)$
看到了吗

我对您的正则表达式做了两个更改:

  • 通过在开始处添加
    ?>
    ,我创建了第一组(
    (?>\d{1,11})
    )。这是为了避免回溯到已匹配的数字

  • 我添加了一个
    (?!af | a | f)
    ,以确保后面没有af、a或f。为了让这一切顺利进行,我需要第一组是原子的,以确保它能真正照顾到前面的最后一个数字。(否则它将回溯,看到前面最后一个数字,认为一切正常,并将字符串的其余部分与最后一个
    *
    )匹配)


  • 对于
    a(?>bc | b)c
    你可以说它与
    a(bc)c
    相同,但是对于更复杂的表达式你不能说。问题是:你有一个字符串“abc”和原子表达式。很明显,你的表情会和“a”匹配。然后,它将尝试第一个备选的“bc”,它也将匹配,但是在备选之后需要一个“c”,但是字符串是完全匹配的。通常它会回溯并尝试第二种选择,但由于它是一个原子组,它不会回溯,因此它失败了,因为字符串中没有剩余的“c”,可以由正则表达式中的最后一个“c”匹配。好的,谢谢。为了得到一个带有数字部分“125”的MatchData对象,我对正则表达式进行了如下修改:^((?>\d{1,11}))(?!af | a | f)((?:(?:c?o | co.*))$