求Java正则表达式:提取单引号间内容(后单引号在括号/逗号前)
Java正则提取指定位置单引号内文本解决方案
可行正则表达式
用于提取单引号包裹的文本,且结束单引号后(允许空白字符)紧跟(、)、[、]或,的正则表达式如下:
'((?:[^']|'(?![\s]*[()\[\],]))*)'(?=[\s]*[()\[\],])
Java代码示例
import java.util.regex.Matcher; import java.util.regex.Pattern; public class QuoteExtractor { public static void main(String[] args) { String testStr = "( $REC_REM$.cApplicationOrigin == '---' ) || ( $REC_REM$.cApplicationOrigin in ['AOL MOBILE','FASTWEB','POS.TE','SALES'FORCE','13'] )"; Pattern pattern = Pattern.compile("'((?:[^']|'(?![\\s]*[()\\[\\],]))*)'(?=[\\s]*[()\\[\\],])"); Matcher matcher = pattern.matcher(testStr); while (matcher.find()) { System.out.println(matcher.group(1)); } } }
运行后输出结果:
--- AOL MOBILE FASTWEB POS.TE SALES'FORCE 13
正则逻辑解释
':匹配起始单引号- 捕获组
((?:[^']|'(?![\s]*[()\[\],]))*):[^']:匹配任意非单引号字符'(?![\s]*[()\[\],]):匹配单引号,但通过正向否定预查确保该单引号后不会紧跟(允许空白)指定的边界符号,以此保留文本内部的单引号(如SALES'FORCE中的单引号)
':匹配结束单引号(?=[\s]*[()\[\],]):正向预查,确保结束单引号后(允许空白)是指定的边界符号((、)、[、]或,)
原正则问题分析
你之前使用的正则'([^'\\]*(?:\\.[^'\\]*)*)仅能处理转义单引号(如\'),且会在第一个未转义的单引号处终止匹配,无法保留文本内部未转义的单引号(比如SALES'FORCE中的单引号),同时也没有限定结束单引号的位置,导致不符合你的提取规则。
内容的提问来源于stack exchange,提问作者Plijen
相关产品推荐
相关产品推荐

