Regex 检查正则表达式子模式是否不包含以前的子模式?
我想知道是否有一种方法可以检查给定序列的子模式匹配,以便阻止它 例如,假设我想要捕捉所有的东西,除了先前捕捉的重复。因此,如果我有一个句子Regex 检查正则表达式子模式是否不包含以前的子模式?,regex,recursion,Regex,Recursion,我想知道是否有一种方法可以检查给定序列的子模式匹配,以便阻止它 例如,假设我想要捕捉所有的东西,除了先前捕捉的重复。因此,如果我有一个句子[word plus word],那么下面的句子应该能够捕捉到第二次出现word之前的所有内容(word plus) (\w+)[^\1]+ 第一个(\w+捕获word。第二个[^…]捕获组尝试将其排除(它是前面捕获的\1),但它只对字符有效,而不对子模式捕获有效 那么还有什么方法可以做到这一点呢?您可以使用如下模式: (\w+)(?:(?!\1).)*
[word plus word]
,那么下面的句子应该能够捕捉到第二次出现word
之前的所有内容(word plus
)
(\w+)[^\1]+
第一个(\w+
捕获word
。第二个[^…]
捕获组尝试将其排除(它是前面捕获的\1
),但它只对字符有效,而不对子模式捕获有效
那么还有什么方法可以做到这一点呢?您可以使用如下模式:
(\w+)(?:(?!\1).)*
(\w+).*?(?=\1)
\b(\w+)\b.*?(?=\1)
它使用一个负的前视来断言(在每个字符处)先前匹配的单词不包含在子表达式中。您可以使用惰性量词和前视,如下所示:
(\w+)(?:(?!\1).)*
(\w+).*?(?=\1)
\b(\w+)\b.*?(?=\1)
您可能还希望用如下单词边界环绕w+:
(\w+)(?:(?!\1).)*
(\w+).*?(?=\1)
\b(\w+)\b.*?(?=\1)
这样你就不会匹配这样的东西:您好,在哪里匹配“ll”就是这样,你需要更多的分数。这个答案我已经用了很多次了<代码>(\w+).*(?!\1)无法正常工作,在
foo barfoo
中,当需要foo bar
时,它将匹配foo
。也许你的意思是(\w+).*(?=\1 |$)
。