我正在寻找一个允许单引号或双引号字符串的正则表达式,并允许字符串中的相反引号字符。例如,以下都是合法的字符串: “你好'那'世界” '你好'那里有“世界”
我使用的正则表达式使用负向前瞻,如下所示:
(['"])(?:(?!\1).)*\1
我认为这会起作用,但如果语言不支持负面预测呢?有没有其他方法可以做到这一点?没有交替?
编辑:
我知道我可以使用轮换。这更像是一个假设的问题。假设我在初始角色类中有20个不同的角色。我不想写出20种不同的变化。我试图实际上否定捕获的角色,而不使用前瞻,后瞻或交替。
答案 0 :(得分:7)
这实际上比您可能已经意识到的要简单得多。你真的不需要负面的预测。你想要做的是像这样的非贪婪(或懒惰)匹配:
(['"]).*?\1
?
之后的.*
字符是重要部分。它说,在击中正则表达式的下一部分之前消耗尽可能少的字符。所以,你得到任何一种引用,然后你去追寻0-M字符,直到你遇到一个匹配你最初遇到的引用的字符。您可以详细了解贪婪匹配与非贪婪here和here。
答案 1 :(得分:1)
不确定
'([^']*)'|"([^"]*)"
成功匹配后,$+
变量将保留匹配的替代内容。
答案 2 :(得分:1)
在一般情况下,正则表达式并不是真正的答案。您可能对Text::ParseWords之类的东西感兴趣,它会对文本进行标记,计算嵌套引号,反斜杠引号,反斜杠空格以及其他奇怪之处。