如下是一段java代码,我想用正则表达从中提取代码中的字符串
cond_buffer.append(" ORDER BY \"name\" \"").append(join(order_by_column,"\","));
java是通过前后用双引号包含定义字符串的。但简单使用正则表达式".*?"
是不可行的,因为会将" ORDER BY \"name\" \""
中的\"
识别为字符串边界引号而非字符串的一部分,效果如下
为了解决\"
误识别问题,就要用到正则表达零宽负向后行断言(zero-width negative lookbehind assertion)即(?<!pattern)
(?<!pattern)
负向后行断言代表字符串中的一个位置,紧接该位置之前的字符序列不能匹配 pattern。
例如对 “regex represents regular expression” 这个字符串, (?<!\w)re
可以匹配单词开头的 re,但不匹配单词内部的 re。
在本例中我们只需要匹配字符串前后的引号,而不需要匹配以\
开头的"
,就可以使用如下正则表达式:
(?<!\\)".*?(?<!\\)"
即只匹配前面没有反斜杠\
的"
,效果如下:
参考资料
《正则表达式的先行断言(lookahead)和后行断言(lookbehind)》