正则表达式如何提取最外层双引号内带嵌套引号的文本
截取最外层双引号内容的正则方案
问题说明
需要从带固定前缀的文本中,截取最外层一对双引号内部的全部内容,允许内容本身包含双引号字符。
测试用待处理文本:
some text "have "some text" here "that should" be cut"
之前使用的正则:
some text "(?<name>[^"]*)"
实际运行仅返回have,预期需要提取的结果为:
have "some text" here "that should" be cut
问题原因
原正则的捕获组规则[^"]*只会匹配连续的非双引号字符,遇到内容里第一个内嵌的双引号就会终止匹配,根本覆盖不到后面带双引号的内容。
可用正则
直接利用正则默认的贪婪匹配特性即可,写法如下:
some text "(?<name>.*)"
如果待匹配的双引号内容包含换行,开启单行模式(让.支持匹配换行符)即可,对应写法:
some text "(?<name>.*)"s
逻辑说明
正则默认是贪婪匹配模式,.*会尽可能匹配最长的符合规则的内容:匹配时先找到some text 后面的第一个双引号作为起点,之后一直向后匹配到文本末尾,再向前回溯找到整段内容里最后一个双引号作为终点,刚好把首尾两个最外层双引号中间的所有内容(包括内部嵌的所有双引号)都捕获到name组里,跑测试用例就能拿到预期的完整结果。
注意:该方案适配你给出的样例场景,即最外层双引号为前缀后第一个双引号、以及文本末尾最后一个双引号的结构。如果你的文本在最后一个双引号之后还有其他双引号内容,需要根据实际的边界规则调整匹配逻辑。
内容的提问来源于stack exchange,提问作者Idur Jul
相关产品推荐
相关产品推荐

