正则表达式在左引号后匹配 space

Regex to match space after opening quotation mark

我写了一个正则表达式来在一行中匹配两边带引号的句子:
(?<!")"([^"\r]+)"(?!")

输入文字:
牌子说,"Walk." 然后它说,"Don't Walk",然后,"Walk",都在三十秒内。他喊道,"Hurry up."

匹配 1: "Walk."
匹配 2: "Don't Walk"
第 3 场:"Walk"
第 4 场比赛: "Hurry up."

现在,我只想在左引号后包含一个 space 的匹配项。

我试图在第一个引号后的正则表达式中添加 (\ {1})。 现在它看起来像:
(?<!")"((\ {1})[^"\r]+)"(?!")

我的新比赛是:
匹配 1:“然后它说,”

但我预计 没有匹配项 因为在我之前的 4 个匹配项中,引号后没有单个 space。

现在整个事情都搞砸了,因为它忽略了初始结构并独立匹配引号,这导致即使在关闭引号后也会查找 spaces。

知道如何解决这个问题吗?

谢谢

问题是双引号是您的开始和结束 delim 字符。

使用 PCRE 正则表达式:

(?<!")"(?!\ )([^"\r]+)"(?!")(*SKIP)(*F)|(?<!")"\ ([^"\r]+)"(?!")

参见proof(?<!")"(?!\ )([^"\r]+)"(?!")(*SKIP)(*F) 将匹配在初始 " 之后没有 space 的双引号字符串,并将跳过这些匹配。 (?<!")"\ ([^"\r]+)"(?!") 将为您获取预期的匹配项。

“内部引号”可以通过使用前瞻来断言,它要求后面的引号字符总数为 even:

" [^"]*"(?=(([^"]*"){2})*[^"]*$)

参见 live demo(我在 Don't walk 前面添加了 space 以证明正则表达式确实找到了以 space 开头的引用文本)

请注意,您不需要对 space 字符进行转义,并且可以删除 {1} 的量词而不影响结果。

如果您的 objective 是在左引号后恰好有一个 space 时获取连续双引号之间的文本,您可以匹配模式:

(?<=") (?! )[^"\r\n]+(?=")

Start your engine!

如果开头引号后面的 space 不是匹配字符串的一部分,请将正则表达式更改为以下内容。

(?<=" )(?! )[^"\r\n]+(?=")