【问题标题】:Regex replace only double hyphens inside quotations正则表达式仅替换引号内的双连字符
【发布时间】:2014-12-15 18:11:38
【问题描述】:

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

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

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

这是regex 可以做的事情吗,还是我需要想出一些其他的方法(比如将所有文本拆分成一个数组并单步执行,进行更改,然后在结尾)?我可以这样做,但如果有一个单行正则表达式语句可以满足我的要求,这似乎是一种愚蠢的浪费时间。

【问题讨论】:

  • 发布你尝试过的正则表达式
  • 这就像我试过的那样,但如果引号外有连字符,它就会失败。 (将示例中未引用的句子变成双连字符句子,您会看到)。在过去的几天里,我实际上已经尝试了几十种排列方式,很抱歉我没有列出所有排列方式!
  • 对不起,你试过了吗? regexr.com/3a34t引号外有-时不会失败..
  • 这个例子没有像发布的那样工作,但是我能够修改它来让它做我需要的,非常感谢你为我指明了正确的方向!
  • 欢迎来到 Stack Overflow!如果您已经解决了问题,请将其添加为答案或接受下面的答案。这让其他人知道这个问题已经解决了。

标签: php regex


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-24
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多