如果正则表达式引擎你使用支持它,你可以用一个负向前查找和反向引用做到这一点:
(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}
这是对学生的测试? – sln
@sln:no;唉,我既不是学生也不是教师。 – sds