Java Pattern与Matcher正则问题:如何匹配@en前引号内所有字符?
解决Java正则匹配带特殊字符的@en前引号文本问题
你遇到的问题根源在于Java正则中默认的.元字符不会匹配所有Unicode字符,它默认仅覆盖ASCII范围内的非换行字符,遇到像…(或是你例子里的特殊控制字符)这类超出ASCII的内容就会失效。原来的"(.*?)"@en自然就匹配不到这类特殊字符了,给你几个实用的解决方案:
方案1:用[\s\S]代替.匹配任意字符
[\s\S]是一个万能字符组:\s匹配任意空白字符,\S匹配任意非空白字符,两者组合就能覆盖所有字符,包括换行和各类Unicode特殊字符。修改后的正则代码如下:
Pattern pattern = Pattern.compile("\"([\\s\\S]*?)\"@en");
这个方案简单直接,不需要额外启用正则标志,兼容性拉满。
方案2:启用UNICODE_CHARACTER_CLASS和DOTALL标志
Java的Pattern类提供了两个关键标志来扩展.的匹配范围:
DOTALL:让.匹配包括换行符在内的所有字符UNICODE_CHARACTER_CLASS:让.等元字符按照Unicode标准匹配,而非局限于ASCII范围
修改后的代码示例:
Pattern pattern = Pattern.compile("\"(.*?)\"@en", Pattern.DOTALL | Pattern.UNICODE_CHARACTER_CLASS);
启用这两个标志后,.就能真正匹配所有Unicode字符(包括你的目标省略号)和换行符了。
额外提醒:保持非贪婪匹配的好习惯
你用的.*?是非贪婪匹配模式,这非常正确——它能确保匹配到最近的"@en",不会不小心跨过多引号匹配到后面的内容。如果你的文本里没有嵌套引号的场景,当前的非贪婪匹配逻辑完全够用。
拿你的测试行验证:
http://dbpedia.org/resource/ http://www.w3.org/2000/01/rdf-schema#label "…"@en
用上面任意一种方案,都能精准捕获到…这个目标内容。
内容的提问来源于stack exchange,提问作者user8954282
相关产品推荐
相关产品推荐

