我写了一个正则表达式来匹配一行中两侧带有引号的句子:(?<!")"([^"r]+)"(?!")
输入文本:
牌子上写着:"走。然后它说,"不要走路",然后,"走路",所有这些都在三十秒内完成。他喊道:"快点。
匹配 1:">走。
匹配 2:"不要走"比赛3:"走">
比赛4:">快点。
现在,我只想在左引号后包含单个空格的匹配项。
我试图在第一次引用后在正则表达式中添加( {1})
。 现在它看起来像:(?<!")"(( {1})[^"r]+)"(?!")
我的新匹配是:
匹配 1:">然后它说,">
但我预计没有匹配项,因为在我之前的 4 场比赛中,引用后没有一个空格。
现在整个事情都搞砸了,因为它忽略了初始结构并独立匹配报价,这导致即使在关闭报价后也会查找空格。
知道如何解决这个问题吗?
谢谢
问题是双引号是你的开始和结束 delim char。
使用 PCRE 正则表达式:
(?<!")"(?! )([^"r]+)"(?!")(*SKIP)(*F)|(?<!")" ([^"r]+)"(?!")
请参阅证据。(?<!")"(?! )([^"r]+)"(?!")(*SKIP)(*F)
将匹配在初始"
后没有空格的双引号字符串,并将跳过这些匹配项。(?<!")" ([^"r]+)"(?!")
将为您提供预期的匹配项。
内部引号"可以通过使用展望来断言,该展望要求后面的引号字符总数为偶数:
" [^"]*"(?=(([^"]*"){2})*[^"]*$)
观看现场演示(我在Don't walk
前面添加了一个空格,以证明正则表达式确实可以找到以空格开头的引用文本(
请注意,您不需要转义空格字符,并且可以删除{1}
的量词,而不会影响结果。
如果您的目标是在开始引号后正好有一个空格的情况下获取连续双引号之间的文本,则可以匹配以下模式:
(?<=") (?! )[^"rn]+(?=")
启动引擎!
如果左引号后面的空格不是匹配的字符串的一部分,请将正则表达式更改为以下内容。
(?<=" )(?! )[^"rn]+(?=")