2

我正在使用这种模式来匹配解析器中的单引号字符串:

"'.+?'"

但是我需要正则表达式,它可以找到带有 postgres 的单引号字符串,例如单个 qoutes 的转义(加倍单个 qoutes)。需要匹配这样的东西:

"'first', 'sec''ond', 't''hi''rd'"

我想找到以单引号开头和结尾的字符串的最短匹配,所以上面的字符串意味着 3 个子字符串:

'first'
'sec''ond'
't''hi''rd'
4

3 回答 3

5

当然,'(?:[^']|'')*'这是适用的正则表达式:它匹配 a'后跟零个或多个字符,而不是''s 后跟'.

但是,为了提高效率,您可以使用展开循环技术展开它。

'[^']*(?:''[^']*)*'

查看正则表达式演示并注意正则表达式查找所有匹配项需要多少步骤。

正则表达式可以读作

  • '- 匹配一个'
  • [^']*- 然后是零个或多个字符'
  • (?:''[^']*)*- 然后零个或多个序列''后跟零个或多个字符,而不是'
  • '- 然后匹配尾随的'.

此正则表达式具有线性模式,涉及尽可能少的回溯。

请注意:如果您添加前瞻检查在尾随之后是否有字符串或字符串结尾,您仍然可以使您的正则表达式适用于当前场景:,'

'.+?'(?=,|$)
     ^^^^^^^

请参阅正则表达式演示。但是,它依赖于上下文并且效率低于展开的正则表达式。

于 2016-03-01T12:28:54.850 回答
2

'(?:[^']|'{2})+'

一个单引号,后面跟着贪婪的出现:

  • 不是单引号的字符
  • 或两个单引号一起

后跟一个单引号。

演示:https ://regex101.com/r/zP2eK6/1

于 2016-03-01T12:23:46.677 回答
1

对于您提供的模式,这应该有效:

'[\w']+'

即匹配一个单引号后跟一个或多个非空格或单引号后跟一个最终单引号。

于 2016-03-01T12:24:44.667 回答