正则表达式仅替换引号内的双连字符

时间:2014-12-15 18:11:38

标签: php regex

我有一个充满引号的文档,如:"this is a quote"。其中一些引号有两个连字符的子句,如:"this quote - this one right here - has em dashes",有些只有一个连字符,如:"this quote has just one thing - a hyphen"

我正在尝试让一些regex匹配带有两个连字符的所有引号,但不匹配任何带有零或一个连字符的引号,并且不匹配引号之外的任何文本。另外我应该提一下,有些句子中有一个或多个连字符不在引号之外,我也需要忽略它们,并且不要让它们干扰引号中的匹配。我想将正确匹配的引号'双连字符更改为正确的短划线字符。

我尝试使用lookaheads并否定了字符,但似乎无法弄清楚这一点。

这是regex可以做的事情,还是我需要提出某种其他方法(比如将所有文本拆分成数组并单步执行,进行更改然后重新组合所有文本在末尾)?我可以做到这一点,如果有一个单线正则表达式声明可以做我想做的事情,它似乎只是浪费时间。

2 个答案:

答案 0 :(得分:1)

在引号的开头添加\b字边界,并检查引号内的最后一个字符是字母或数字还是某种标点符号。

("\b[^-"]*-[^-"]*-[^-"]*[\w.!?]")

答案 1 :(得分:0)

"(?:[^-"]*-){2}[^-"]*"是关于仅使用正则表达式获得的最佳效果,但如果引号之外有两个连字符,则它不起作用。将文本拆分为数组可能是您想要的最佳方式。