如何用正则表达式匹配以[2]开头行中指定位置到最后一个双引号间的完整内容
如何用正则表达式匹配以[2]开头行中指定位置到最后一个双引号间的完整内容
嗨,我来帮你搞定这个正则匹配的问题!你之前遇到的问题很典型——用[^"]+匹配的时候,会在第一个双引号就停下来,根本没法覆盖中间带双引号的完整内容对吧?
问题根源
你原来的正则(?<=\[2\][^=]+? 1 string data = ")[^"]+里,[^"]+的意思是“匹配任意不是双引号的字符”,所以只要遇到第一个双引号就会停止匹配,自然拿不到到最后一个双引号的完整内容。
解决方案
我们需要的是“从1 string data = "之后,一直匹配到该行最后一个双引号前的所有内容”,不管中间有多少个双引号。这里给你两种可行的正则写法:
写法一:正向预查(适合支持前瞻的正则引擎)
(?<=^\[2\].*?1 string data = ").*(?="[^"]*$)
各部分解释:
(?<=^\[2\].*?1 string data = "):先定位好起始位置——确保是行开头的[2],然后非贪婪匹配到1 string data = "这一段。.*:贪婪匹配任意字符(单行模式下,.不包含换行;如果要支持多行内容,换成[\s\S]*或者启用单行修饰符s)。(?="[^"]*$):确保后面跟着的是该行最后一个双引号——也就是这个双引号之后,直到行尾再也没有其他双引号了。
写法二:捕获组(兼容性更好,适合不支持前瞻的引擎)
^\[2\].*?1 string data = "(.*)"[^"]*$
这种写法把我们需要的内容放到了捕获组$1(或\1,取决于正则引擎)里,用法是匹配整行后,提取捕获组1的内容即可。
实战示例
拿你给的例子来说:
输入行:
[2]
1 string data = ""some text" in english" and "other""
用上面的正则匹配到的内容是:"some text" in english" and "other"
把这段内容替换成你想要的"un pò di testo" in Italiano" and "other"后,就能得到你期望的结果:
[2]
1 string data = ""un pò di testo" in Italiano" and "other""
小提醒
- 如果你的文本是多行的,记得把
.*换成[\s\S]*,或者给正则加上单行修饰符(比如Python里的re.S,JavaScript里的sflag),这样才能匹配换行符。 - 注意
[和]是正则的特殊字符,必须用\[和\]转义哦~
备注:内容来源于stack exchange,提问作者Kenryoku
相关产品推荐
相关产品推荐

