正则表达式问题 - 否定捕获的角色

时间:2010-08-25 22:57:04

标签: regex perl

我正在寻找一个允许单引号或双引号字符串的正则表达式,并允许字符串中的相反引号字符。例如,以下都是合法的字符串: “你好'那'世界” '你好'那里有“世界”

我使用的正则表达式使用负向前瞻,如下所示:

(['"])(?:(?!\1).)*\1

我认为这会起作用,但如果语言不支持负面预测呢?有没有其他方法可以做到这一点?没有交替?

编辑:

我知道我可以使用轮换。这更像是一个假设的问题。假设我在初始角色类中有20个不同的角色。我不想写出20种不同的变化。我试图实际上否定捕获的角色,而不使用前瞻,后瞻或交替。

3 个答案:

答案 0 :(得分:7)

这实际上比您可能已经意识到的要简单得多。你真的不需要负面的预测。你想要做的是像这样的非贪婪(或懒惰)匹配:

(['"]).*?\1

?之后的.*字符是重要部分。它说,在击中正则表达式的下一部分之前消耗尽可能少的字符。所以,你得到任何一种引用,然后你去追寻0-M字符,直到你遇到一个匹配你最初遇到的引用的字符。您可以详细了解贪婪匹配与非贪婪herehere

答案 1 :(得分:1)

不确定

'([^']*)'|"([^"]*)"

成功匹配后,$+变量将保留匹配的替代内容。

答案 2 :(得分:1)

在一般情况下,正则表达式并不是真正的答案。您可能对Text::ParseWords之类的东西感兴趣,它会对文本进行标记,计算嵌套引号,反斜杠引号,反斜杠空格以及其他奇怪之处。