Regexp问题-否定捕获的字符
我正在寻找一个正则表达式,它允许单引号或双引号字符串,并允许字符串中的反引号字符。例如,以下两者都是合法字符串: “你好,这里是世界” “你好”这里是“世界” 我使用的regexp使用负前瞻,如下所示:Regexp问题-否定捕获的字符,regex,perl,Regex,Perl,我正在寻找一个正则表达式,它允许单引号或双引号字符串,并允许字符串中的反引号字符。例如,以下两者都是合法字符串: “你好,这里是世界” “你好”这里是“世界” 我使用的regexp使用负前瞻,如下所示: (['"])(?:(?!\1).)*\1 我想这是可行的,但是如果语言不支持消极前瞻呢。还有别的办法吗?没有改变 编辑: 我知道我可以使用交替。这不仅仅是一个假设性的问题。假设我在最初的角色类中有20个不同的角色。我不想写出20种不同的备选方案。我试图在不使用前向、后向或交替的情况下,实际否定
(['"])(?:(?!\1).)*\1
我想这是可行的,但是如果语言不支持消极前瞻呢。还有别的办法吗?没有改变
编辑:
我知道我可以使用交替。这不仅仅是一个假设性的问题。假设我在最初的角色类中有20个不同的角色。我不想写出20种不同的备选方案。我试图在不使用前向、后向或交替的情况下,实际否定捕获的角色。确定:
'([^']*)'|"([^"]*)"
成功匹配后,$+
变量将保存匹配的任何替代项的内容。确定:
'([^']*)'|"([^"]*)"
在成功匹配时,
$+
变量将保存匹配的替代项的内容。这实际上比您可能意识到的要简单得多。你真的不需要消极的前瞻。您要做的是一个非贪婪(或懒惰)的匹配,如下所示:
(['"]).*?\1
*
后面的?
字符是重要部分。它说,在进入正则表达式的下一部分之前,使用尽可能少的字符。因此,您可以得到任何一种引号,然后在0-M个字符之后,直到遇到与您第一次遇到的引号匹配的字符。您可以了解更多关于贪婪匹配与非贪婪匹配的信息。这实际上比您可能意识到的要简单得多。你真的不需要消极的前瞻。您要做的是一个非贪婪(或懒惰)的匹配,如下所示:
(['"]).*?\1
*
后面的?
字符是重要部分。它说,在进入正则表达式的下一部分之前,使用尽可能少的字符。因此,您可以得到任何一种引号,然后在0-M个字符之后,直到遇到与您第一次遇到的引号匹配的字符。您可以了解贪婪匹配与非贪婪匹配的更多信息。在一般情况下,regexp并不是真正的答案。您可能会对这样的东西感兴趣,它标记文本、解释嵌套引号、反斜杠引号、反斜杠空格和其他奇怪的东西。在一般情况下,regexp并不是真正的答案。您可能会对以下内容感兴趣:标记文本、解释嵌套引号、反斜杠引号、反斜杠空格和其他奇怪的内容。是否也允许反斜杠转义引号?他们擅长使事情复杂化:考虑到下面给出的答案,使用交替不是一个小小的调整吗?交替的顺序至关重要,这样圆点就不会消耗反斜杠,从而使捕获的字符保持匹配:(['”)(\\\1|)*?\1您是否也打算允许反斜杠转义引号?它们擅长使问题复杂化:P考虑到下面给出的答案,使用交替是不是只是一个小小的调整?交替的顺序至关重要,这样圆点就不会消耗反斜杠,从而使捕获的字符保持匹配:(['”)(\\\1 |。)*?\1谢谢!这就是我要找的。完全忘记了懒惰的量词。好吧,现在我觉得很愚蠢,没必要感到难过——正则表达式很强大,但很复杂。很难把这一切都记在脑子里。这就是SO.com的作用。通过使用-(['“])[^\1]*?\1
@Peter Ajtai,可以稍微改进正则表达式。在字符类中不允许反向引用。该类提供除\001 aka chr(1)之外的任何字符@ysth-哎呀。我才意识到。谢谢你的澄清。谢谢你!这就是我一直在寻找的。完全忘记了懒惰的量词。好吧,现在我觉得很愚蠢,没有必要感到不好-正则表达式很强大,但很复杂。很难在你的脑子里记住这一切。这就是SO.com的作用。正则表达式可以通过删除e使用-(['“])[^\1]*?\1
@Peter Ajtai匹配所有
,不,它不能;字符类中不允许反向引用。该类为您提供除\001 aka chr(1)之外的任何角色。@ysth-Whoops。我才意识到。谢谢你的澄清。