Regex 正则表达式来匹配带有偶数引号的字符串

Regex 正则表达式来匹配带有偶数引号的字符串,regex,Regex,我想出了:([^”]*[“][^”]*[“][^”]*])* 除了针对空字符串之外,它在所有情况下都有效。我认为它会有效,因为最后一个星号与前一个标记zero匹配了多次 有什么想法吗 如果有更好的方法,请让我知道并详细解释 解决方案必须是正则表达式,因为使用它的地方是一个需要正则表达式的钩子。 它还必须匹配不带引号的字符串,因为零是一个偶数似乎regexp不是适合此项工作的工具。编辑:但是,您似乎仅限于此。鉴于此限制,这并不能回答您的问题,但如果没有它,它将非常有用 只需迭代字符串并计数即可。C

我想出了:
([^”]*[“][^”]*[“][^”]*])*

除了针对空字符串之外,它在所有情况下都有效。我认为它会有效,因为最后一个星号与前一个标记zero匹配了多次

有什么想法吗

如果有更好的方法,请让我知道并详细解释

解决方案必须是正则表达式,因为使用它的地方是一个需要正则表达式的钩子。


它还必须匹配不带引号的字符串,因为零是一个偶数

似乎regexp不是适合此项工作的工具。编辑:但是,您似乎仅限于此。鉴于此限制,这并不能回答您的问题,但如果没有它,它将非常有用

只需迭代字符串并计数即可。C示例:

bool hasEvenNumberOfQuotes(const char *str)
{
    bool even = true;

    while(*str != '\0')
    {
        if(*str == '"')
            even = !even;

        ++str;
    }

    return even;
}
尝试以下表达式:

^(?:[^"]+|"[^"]*")*$
它匹配一个序列,该序列由除引号(
[^”]+
)以外的任何字符组成,或由除引号(
“[^”]*”
)以外的任何字符组成。
*
量词考虑空字符串

import re

def hasPairedQuotes(s):
    stripped = re.sub('[^"]', "", s)
    return len(stripped) % 2 == 0

>>> hasPairedQuotes("")
True
>>> hasPairedQuotes('""')
True
>>> hasPairedQuotes('"""')
False
>>> hasPairedQuotes('"Hello world!""')
False
>>> hasPairedQuotes('"Hello world!"')
True

好的,你想要一个regexp,这里有一个regexp:
^[^”]*(“[^”]*”*[^”]*$
。。。但我认为易读性和可维护性的差异不言而喻

>>> re.match(r'^[^"]*("[^"]*"[^"])*$', 'Hello ""')
<_sre.SRE_Match object at 0xb7cc0ce0>
>>> re.match(r'^[^"]*("[^"]*"[^"])*$', 'Hello "" "')
>>> 
重新匹配(r'^[^”]*(“[^”]*“[^”]*)*$”,“你好”) >>>关于匹配(r'^[^“]*(“[^”]*“[^”]])*$”,“Hello”“”) >>> 基于您的regexp:

([^"]*["][^"]*["][^"]*)*
添加线锚:

^([^"]*["][^"]*["][^"]*)*$
添加与非代码匹配的可能性“”:

最后一步不允许匹配任何内容,也不允许使用字符。这允许匹配缺少
的字符串。请注意,需要使用线锚,否则子字符串将与此匹配

好处:防止组反向引用(命名/编号组可能会稍微降低regexp引擎的速度):

您的正则表达式应该匹配完全空的字符串,但不能匹配由单个空格组成的字符串,因为您的正则表达式声明,如果字符串不是完全空的,则它至少需要包含一个双引号。这是因为正则表达式中的[“]标记后面没有*

考虑所需正则表达式的正确方法如下:您希望匹配(不带双引号的字符串),然后是(不带双引号的字符串)加(不带双引号的字符串),然后是(不带双引号的字符串),然后从第一个“后跟”无限重复。不带双引号的字符串是[^”]*,因此您可以得到(为可读性添加了空格):


如果将其与正则表达式进行比较,则第一个[^“]*已从重复中移出。。

遗憾的是,我将使用代码的地方暴露了一个钩子,该钩子是一个匹配或不匹配的正则表达式,因此只有正则表达式解决方案才会阻止我。@Reis,不知道你为什么在说这些时投了反对票“此外,如果有更好的方法,请让我知道并详细解释。“它回答了你的问题。请编辑您的问题,说明您仅限于使用regexp。为什么原始问题中没有此详细信息?你明确地问是否有更好的方法。我想他指的是更好的正则表达式。我甚至不知道那是什么语言。。也许是植物?无论如何这对我也没有帮助。@Reis,PCRE在不同语言之间是相当一致的。不过,不同的regexp引擎处理regexp的方式可能不同,因此可能需要稍加修改。您需要移动前导或尾随[^“]*(但不能同时移动两者)回到括号内,捕捉引用部分之间的非引号。您忘记了详细解释,以及为什么我的不起作用。除了快速和肮脏的修复之外,我还想学习一些东西…:-)您的不起作用,因为它要么匹配零个字符(组重复零次)至少包含两个引号的一个或多个字符(组重复一次)。因此,不存在序列只是引号以外的字符的情况。David没有说任何关于匹配不带引号的字符串的内容,但他也说他的正则表达式与空字符串不匹配,很明显是这样。@David,这是你真正想做的吗?没有引号的字符串有偶数个引号(0),因此它应该匹配。我确实希望它只匹配带空格的字符串。事实上,任何不带引号的字符串都可以,因为它将有偶数个引号(0)是的,我的回答是,你在原始问题中给出的正则表达式与空字符串匹配,但它与没有双引号的非空字符串不匹配,这就是你的正则表达式的问题所在。
^([^"]*["][^"]*["][^"]*|[^"]?)*$
^(?:[^"]*["][^"]*["][^"]*|[^"]?)*$
[^"]* (" [^"]* " [^"]*)*