正则表达式如何匹配引号内内容并排除首尾引号?
解决引号内内容匹配(排除引号)的正则调整方案
看来你是想从目标字符串里精准提取引号包裹的内容,却不小心把开头的引号也带进来了——这是正则匹配时很常见的小问题,我来帮你调整一下:
核心问题分析
你当前用的正则"([a-zA-Z0-9\s?]+),开头的"会被当作匹配的一部分,所以如果直接取整个匹配结果,自然会带上开头的引号。而且这个正则还有个小缺陷:它只限定了匹配字母、数字、空格和问号,万一引号内有其他字符(比如标点)就会匹配不全,同时也没处理闭合的引号,可能会匹配超出预期的内容。
调整方案
根据你的需求,有两种常用的解决思路:
思路1:使用正向预查(直接匹配不带引号的内容)
如果你希望整个匹配结果就是引号内的内容(不需要额外取捕获组),可以用正向预查来确保前面是引号,但不把引号包含在匹配结果里:
(?<=")[^"]+
(?<="):正向预查,检查当前位置前面是一个双引号,但不会把这个引号包含到匹配结果中[^"]+:匹配任意数量(至少1个)的非引号字符,这样会精准停在闭合的引号前,比限定字符集更通用
用这个正则匹配你的字符串,得到的结果就是["Documents", "For boss"],完全不带引号。
思路2:保留捕获组,提取捕获组内容
如果你想继续基于原正则调整,只需要确保你提取的是捕获组1的内容,而不是整个匹配项。调整后的正则可以完善一下闭合引号的处理:
"([^"]+)"
- 外层的
"匹配前后的引号,([^"]+)捕获引号内的所有非引号字符。此时整个匹配结果是带引号的(比如"Documents"),但捕获组1的内容就是Documents,直接取捕获组1即可得到你想要的结果。
验证效果
用调整后的正则匹配SRE("Documents", with: "For boss"),两种方案都能精准得到:
DocumentsFor boss
内容的提问来源于stack exchange,提问作者LakaLe_
相关产品推荐
相关产品推荐

