匹配特殊字符与正则表达式预测

时间:2016-02-08 18:22:46

标签: javascript regex

我收到的信息有下划线:

  _omgitworks_

但是,当我们收到的HTML线格式化程序格式化这些消息时 他们的下划线前面有反斜杠:

  \_omgitworks\_

我创建了以下正则表达式来捕获反斜杠并删除它们 文本正确标记:

rawInput.replace(/\\([_])/g, '$1');

然而,当用户将文本斜体化时存在边缘情况。当用户 utalicizes文本,我们收到消息没有反斜杠,但有 下划线 - 我们想要删除下划线。这就是收到的 文字看起来像:

_omgitworks_

我正在尝试设计一个正则表达式,匹配反斜杠后跟一个 下划线然后替换反斜杠(但不是下划线)或者如果有的话 只是一个没有bachslash的下划线,它只匹配下划线。

我尝试使用lookaheads实现这一点:

var regex = /\\(?=_)|_/g;
var string = '\\_omgitworks\\_'
string.replace(regex, '')
>>> "omgitworks"

但它正在删除反斜杠和下划线而不仅仅是 下划线。我忽略了前瞻性的细微差别吗?

1 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式:

\\(_)|(^|[^\\])_

并替换为$1$2

请参阅regex demo

解释

  • \\(_) - 第一个替代匹配\,后跟_(捕获组1)
  • | - 或......
  • (^|[^\\])_ - 字符串的另一个替代匹配开头或除\以外的任何字符(捕获到第2组)后跟下划线。

在关系部分,我们使用反向引用恢复捕获。在JS中,失败的组总是预先填充空字符串,因此即使捕获组恰好为空也可以安全使用。



var re = /\\(_)|(^|[^\\])_/g; 
var str = '_omgitworks_\n\\_omgitworks\\_';
var result = str.replace(re, '$1$2');
document.body.innerHTML = "<pre>"+ result + "</pre>";
&#13;
&#13;
&#13;