2014-03-05 50 views
0

这是一个后续Regular expression which matches at least two words from a list正则表达式相匹配至少两个不同的黑名单字

我怎样写一个正则表达式这会从列表中匹配至少两个不同

例如,给出的列表"foo""bar""baz",我想正则表达式匹配"foo..bar"但不"foo..foo""z baz "

就像在原来的问题,我想,以避免重复的正则表达式单词列表(如果我的黑名单有30长度而不是3作为例子吗?)

+0

这是对学生的测试? – sln

+0

@sln:no;唉,我既不是学生也不是教师。 – sds

回答

2

如果正则表达式引擎你使用支持它,你可以用一个负向前查找和反向引用做到这一点:

(foo|bar|baz).*(?!\1)(foo|bar|baz) 

(?!\1)意味着“后面没有一个第一个捕获组中”。

不重复两次列表中的PCRE正则表达式引擎提供不同的语法:

(foo|bar|baz).*(?!\1)(?1) 

(foo|bar|baz).*(?!\g{1})\g<1> 

(?<list>foo|bar|baz).*(?!\g{list})\g<list> 

(?(DEFINE)(?<list>foo|bar|baz))(\g<list>).*(?!\1)\g<list> 

使用Ruby:

(foo|bar|baz).*(?!\k<1>)\g<1> 

(?<list>foo|bar|baz).*(?!\k<list>)\g<list> 

(?<list>foo|bar|baz){0}\g<list>.*(?!\k<list>)\g<list> 

但是,如果正则表达式引擎不具备的功能重用子模式,你可以试试这个模式(与pcre,Python re模块,Java,.NET,Ruby一起使用,但不能使用Javascript和XRegExp)

(?:(?!\1)(foo|bar|baz).*){2} 

说明:

在没有定义捕获组开始时(第一次)和反向引用\1太。正则表达式引擎忽略预见条件(注意这意味着正则表达式引擎不会将(?!\1)视为(?!),但选择跳过测试!)。然后捕获列表中的第一个单词,第二次现在定义反向引用\1,并且向前看它的工作。

当R语言,你可以把它(在Java中的)工作中使用帕拉姆perl=TRUE和逃避反斜杠:

(?:(?!\\1)(foo|bar|baz).*){2} 
+0

+1击败我。 – sln

+0

balibaliba嘿嘿嘿。 –

+0

这会重复两次单词列表 - 这可以避免吗? – sds

相关问题