【问题标题】:Regular expression for single quotes单引号的正则表达式
【发布时间】:2015-12-07 18:52:17
【问题描述】:

经过很长时间试图找到一个好的正则表达式来查找,然后用单引号(›‹)替换单引号(''),照顾撇号,我想出了这个:

‘((([^‘]*’)*[^‘]*)+)’

我已经在 PHP Live Regex 上成功测试了它。但是,它只适用于 preg_match,有时也适用于 preg_replace(作为替代,我使用 ›$1‹)。

可能是反向引用的问题吗?有谁知道更好的解决方案?

编辑

当我尝试更改类似于

的字符串时,我遇到的问题是 灾难性的回溯
one ‘two’s’ ‘three’ four

one ›two’s‹ ›three‹ four

【问题讨论】:

  • 您能提供任何示例字符串吗?另外,您遇到了什么问题?
  • 另外,可疑的结果会很有用。
  • 随时修改this fiddle 以显示您遇到的问题。
  • 是的,它说的是灾难性的回溯! :-( 感谢@stribizhev 的参考,以后会更多地咨询网站。@Num6 预期的结果真的很简单:将one ‘two’s’ ‘three’ four 更改为one ›two’s‹ ›three‹ four
  • ‘((?:[^‘]*’)*[^‘]*)’ 是否为您的所有输入字符串修复它?您提供的那个实际上并没有导致灾难性的回溯,但很明显问题在于组内的嵌套量词和可选模式。

标签: php regex


【解决方案1】:

你可以使用

‘((?:[^‘]*’)*[^‘]*)’

demo

主要更改是删除外部(...)+,这会产生嵌套量词问题。 [^‘]*’)*[^‘]* 都可以匹配 emtpy 字符串,并且当用 + 量词分组时,完成匹配的步骤数呈指数级增长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多