2016-04-25 72 views
-3

我想找到多行文本字符串cckk末开始,并且必须包括字符串c3c4,但不能包含字符串ddee,下面的测试数据:谁能帮我写一个正则表达式?

t1 b1 cc 
c3 c4 z1 
t3 dd kk 

t4 b2 cc 
c4 c3 z2 
t6 ee kk 

t7 b3 cc 
c3 c4 z3 
t9 ff kk 

t7 b3 cc 
c4 c3 z3 
t9 ff kk 

预期结果只有:

cc 
c3 c4 z3 
t9 ff kk 

cc 
c4 c3 z3 
t9 ff kk 

我写了一个正则表达式(C#),但预计不会这样的结果。

回答

2

您需要使正则表达式引擎在匹配每个单个字符之前检查条件。

@"(?s)\bcc\b(?:(?!dd|ee).)*?\bkk\b" 

DEMO

(?:(?!dd|ee).)*?应匹配任何字符,但不的ddee,零次或多次(非贪婪地)。 \

更新:

(?s)\bcc\b(?:(?!\bdd\b|\bee\b).)*?\bc3\b(?:(?!\bdd\b|\bee\b).)*?\bkk\b 
+0

@MikeMB补充了一下。您可以在我附加的演示链接的右侧看到每个正则表达式模式的解释。如果对此解释有任何疑问,请随时询问我.. –

+0

非常感谢 –

+0

以获得更高的准确性,'@“(?s)\ bcc \ b(?:(?!\ b(?:dd | ee )\ b)。)*?\ bkk \ b“' –

1

试试这个

cc(?:\s(?!dd|ee)\w{2})*\skk 

Regex demo

说明:
(?: …):非捕获组sample
\s: “空白字符”:空格,制表符,换行符,回车,垂直制表sample
(?!…):负先行sample
|:轮换/ OR操作数sample
\w: “单词字符”:ASCII字母,数字或下划线sample
*:零或更多次sample

(?!dd|ee)\w{2} 2字符,但ddeesample