正则表达式负面看法

时间:2015-05-16 17:10:05

标签: regex

我试图找到一个与" ab"匹配的单词的正则表达式。但不是" cd"。

例如,此正则表达式应与以下内容匹配:

abc
dab
kab

它不符合以下内容:

abcd
cdab
abertcd

2 个答案:

答案 0 :(得分:0)

您可以在单词的开头使用否定前瞻:

\b(?![a-z]*cd)[a-z]*ab[a-z]*\b

使用不区分大小写的i选项来匹配大写字词。

\b匹配单词的开头,(?![a-z]*cd)确保在由英文字母组成的单词中没有cd。最小的单词是ab

根据编程语言,可以进一步增强(例如匹配Unicode字母)。

请参阅demo

答案 1 :(得分:-1)

您可以使用(否定)lookaround来确保ab在字符串中,但cd不是:

^(?!.*cd).*ab.*$

Regular expression visualization

Debuggex Demo

^ - 字符串的开头
(?!.*cd) - 否定前瞻:不匹配cd后面的任何内容(包括空字符串) .*ab.* - 包含ab
的任何字符串 $ - 字符串的结尾

Java示例:

System.out.println("ab".matches("^(?!.*cd).*ab.*$")); // true
System.out.println("abx".matches("^(?!.*cd).*ab.*$")); // true
System.out.println("xab".matches("^(?!.*cd).*ab.*$")); // true
System.out.println("cdab".matches("^(?!.*cd).*ab.*$")); // false
System.out.println("abcd".matches("^(?!.*cd).*ab.*$")); // false
System.out.println("abxxcd".matches("^(?!.*cd).*ab.*$")); // false
System.out.println("cdxxab".matches("^(?!.*cd).*ab.*$")); // false

Python示例:

import re
a = re.compile(r'^(?!.*cd).*ab.*$')
print a.match('abc') is not None # True
print a.match('abcd') is not None # False
print a.match('cdab') is not None # False
print a.match('ab') is not None # True
print a.match('abdc') is not None # True
print a.match('xab') is not None # True