Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regexp问题-否定捕获的字符_Regex_Perl - Fatal编程技术网

Regexp问题-否定捕获的字符

Regexp问题-否定捕获的字符,regex,perl,Regex,Perl,我正在寻找一个正则表达式,它允许单引号或双引号字符串,并允许字符串中的反引号字符。例如,以下两者都是合法字符串: “你好,这里是世界” “你好”这里是“世界” 我使用的regexp使用负前瞻,如下所示: (['"])(?:(?!\1).)*\1 我想这是可行的,但是如果语言不支持消极前瞻呢。还有别的办法吗?没有改变 编辑: 我知道我可以使用交替。这不仅仅是一个假设性的问题。假设我在最初的角色类中有20个不同的角色。我不想写出20种不同的备选方案。我试图在不使用前向、后向或交替的情况下,实际否定

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

我使用的regexp使用负前瞻,如下所示:

(['"])(?:(?!\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。我才意识到。谢谢你的澄清。