正则表达式排除子模式

4
我有一些代码需要与一个非常简单的字符串模式匹配: XXnnnnnnnnn (2个字母数字,9个数字)
我正在使用这个正则表达式: \w{2}\d{9}
现在我需要排除任何以常量令牌 'AY' 开头的字符串,以及任何包含11个重复字符的字符串(例如 '11111111111' 或 '00000000000')。
如何使用正则表达式排除子模式?

您是否在某种编程语言的范围内使用这个正则表达式?我认为通过语言的方式检查会更容易和清晰。 - Andrew Logvinov
最初没有这个标签 =) - Andrew Logvinov
2个回答

5

试试这个

\b(?!AY)(?!(\w)\1{10})\w{2}\d{9}\b

Regexr中查看。

基本上,我只是在你的正则表达式中添加了\b单词边界,以避免部分匹配。

使用负向先行断言实现了您的限制。

(?!AY) 如果模式以“AY”开头,则断言失败。

(?!(\w)\1{10}) 如果第一个单词字符重复10次或更多次,则断言失败。

在regular-expressions.info上查看Lookaround assertions


2
您可以使用零宽度正向预查匹配器来排除这两种情况。
不匹配AY很容易:
 (?!AY)

不匹配11个相同字符更加困难。你需要使用回溯引用(这意味着正则表达式不再是严格的正则表达式),或者你可以显式地匹配每个数字。

(?!0{11}|1{11}|2{11}|…|9{11})  // 11 zeros, or 11 ones, or 11 twos, …
(?!(.)\1{10})  // A character, followed by itself 10 more times.

因此,完整的正则表达式为:

(?!AY)(?!(.)\1{10})\w{2}\d{9}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接