【问题标题】:RegEx to find all occurrences of a character not between two other characters正则表达式查找不在两个其他字符之间的字符的所有出现
【发布时间】:2016-11-15 16:43:21
【问题描述】:

我正在寻找一个匹配所有出现的字符的正则表达式(我可以在 Javascript 中实现,所以没有后视),只要它没有出现在其他两个字符之间。例如,我想匹配所有连字符,只要它们不在加号之间。

----- // should match.
+---+ // should not match
---+---+--- // should only match the first 3 and last 3 characters.

我尝试过像这样调整this post 中使用的方法:

[-]+(?![^+]*\+)+

但它没有按要求匹配。任何帮助是极大的赞赏。

附:专门寻找 REGEX 解决方案。我意识到这可能不是最佳解决方案,但我特别想提高我对正则表达式的了解。

【问题讨论】:

  • 为什么必须是正则表达式?使用字符串方法实现这一点很简单。
  • 这是一个 XY 问题。请解释一下你在现实生活中的所作所为。
  • 我不能在 SO 上问 XY 问题?
  • /(^-+|-+$|(?!.*\+)-+)/g
  • 也许你可以使用The Trick:\+-+\+|(-+)(:

标签: javascript regex regex-lookarounds


【解决方案1】:

如果分隔符(在你的情况下为+)总是成对出现,你可以使用这个:

var str = 'a-b-+-c-+-d-e'; // delimter is +
matches = str.match(/-(?=([^+]*\+[^+]*\+)*[^+]*$)/g, '');
console.log(matches); // 4 matches of `-`

这匹配后面有偶数个加号(可能为零)的每个连字符。

【讨论】:

    【解决方案2】:

    请尝试以下方法:

    (?:^-+|-+$)
    

    Regex101 演示:https://regex101.com/r/524iej/1

    【讨论】:

      【解决方案3】:

      您可以使用 .replace 删除 2 +s 之间的所有文本:

      str = str.replace(/\+-*\+/g, '');
      

      示例:

      var str = '---+---+---';
      str = str.replace(/\+-*\+/g, '');
      //=> ------
      

      【讨论】:

      • 感谢您的回答,但我问的是如何匹配不在连字符之间的字符。
      • 我想你是要求在加号之间不匹配,对吧?使用这个.replace,我们将删除+s 之间的所有内容,因此只留下2 个+ 符号之外的部分
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多