我写了一个正则表达式来匹配单引号两侧带有引号的句子:
(?<!")"([^"\r]+)"(?!")
输入文字:
标牌上写着:“走路。”然后它说:“别走”,然后“走”,都在三十秒钟之内。他大喊:“快点。”
比赛1:“步行。”
第2场:“不要走路”
第3场:“步行”
第4场:“快点。”
现在,我只想在包含引号的匹配项中包含一个 空格 。
在第一引号之后,我试图在正则表达式中添加(\ {1})
。
现在看起来像:
(?<!")"((\ {1})[^"\r]+)"(?!")
我的新比赛是:
匹配1:”然后,“
但是我希望 没有匹配项 ,因为在我之前的4个匹配项中,引号后都没有空格。
现在,整个事情变得一团糟,因为它忽略了初始结构并独立地匹配了报价,即使在关闭报价后,也会导致查找空间。
有什么办法解决这个问题吗?
谢谢
答案 0 :(得分:1)
问题在于双引号是您的开始和结束delim char。
使用PCRE正则表达式:
(?<!")"(?!\ )([^"\r]+)"(?!")(*SKIP)(*F)|(?<!")"\ ([^"\r]+)"(?!")
请参见proof。 (?<!")"(?!\ )([^"\r]+)"(?!")(*SKIP)(*F)
将匹配在双引号中的字符串,该字符串在起始"
之后没有空格,并且将跳过这些匹配。 (?<!")"\ ([^"\r]+)"(?!")
将为您带来预期的匹配。
答案 1 :(得分:0)
“内部引号”可以通过使用前瞻性来断言,即要求其后的引号字符总数为 :
" [^"]*"(?=(([^"]*"){2})*[^"]*$)
请参见live demo(我在Don't walk
前面添加了一个空格,以证明正则表达式确实找到了以空格开头的引用文字)
请注意,您不需要转义空格字符,可以删除量词{1}
,而不会影响结果。
答案 2 :(得分:0)
如果您的目标是在开始的引号后只有一个空格的情况下获取连续的双引号之间的文本,则可以匹配模式:
(?<=") (?! )[^"\r\n]+(?=")
如果开头引号后面的空格不是要匹配的字符串的一部分,请将正则表达式更改为以下内容。
(?<=" )(?! )[^"\r\n]+(?=")