在分隔符之间匹配正则表达式的有效方法

时间:2016-01-04 10:09:39

标签: regex match

我有一个字符串,想要使用正则表达式匹配两个第一个分隔符之间的子字符串。

例如,带有分隔符create table my_table( id int primary key auto_increment, val1 float, val2 float ); insert into my_table( val1, val2 ) values ( rand(), rand() ); select * from my_table; 的字符串foo"text"bar anotherfoo"anothertext"anotherbar应该会产生"

我找到了以下可能的解决方案:

  • 非贪婪匹配text
  • 与Lookahead和Lookbehind断言的非贪婪匹配"(.*?)"
  • 否定字符类(?<=")(.*?)(?=")

哪一个是最有效的方法?或者我错过了这些解决方案表现不同的情况(假设设置了新的线条修改器以使点与新线匹配)?

1 个答案:

答案 0 :(得分:2)

由于分隔符是单个字符,并且匹配的子字符串不应包含它们,因此否定字符类解决方案("([^"]*)")效率最高。

如果您只想匹配一次,则甚至不需要关闭":只需使用"([^"]*)

当没有结束分隔符且初始分隔符后文本相当大时,延迟点匹配("(.*?)")技术可能会导致性能问题。

Lookarounds几乎总是涉及在每个测试位置检查一些子模式的额外开销。由于这里的分隔符是单个字符,因此这里的lookbehind / lookahead效率不高。如果无法访问捕获组,则只想使用此解决方案。在Python中,捕获效果很好,因此无需使用此解决方案。