【问题标题】:Capturing Reverse Matches of Regex捕获正则表达式的反向匹配
【发布时间】:2016-04-06 19:09:51
【问题描述】:

我有一个正则表达式可以匹配 :-)、*

现在我可以匹配这些,我想使用我的正则表达式来匹配字符以相反顺序书写的表情符号,例如 (-:

看起来前瞻、后瞻和环顾断言不会起到作用,因为它们是非捕获的。有没有一种简单的方法可以反转正则表达式,而不必以相反的顺序完全重写它?

谢谢!

【问题讨论】:

  • 嗯,您可以做的一件事是先反转您正在搜索的字符串,然后找到匹配项,然后在需要时反转结果。
  • 我怀疑它会这么简单,因为您需要翻转(s、<s 和[s 等符号。
  • 你能告诉我们正则表达式吗?
  • 我想如果这是一个复杂的过程,那么我会按照@TomKarzes 的建议去做。我只是觉得可能有一些正则表达式的反向查找选项。
  • @stribizhev 哦,是的,好点 - 这不仅仅是颠倒顺序的问题,而且一些字符也需要改变,例如“(”与“)”等

标签: python regex


【解决方案1】:

更好的解决方案可能是在您使用的语言中生成正则表达式模式,这样您就不必前后手动创建每个表情符号。例如,在 ES6 中:

var emoticons = [":-)", "*<|:-)"],
    patterns = [];

var REVERSE_SWAP = {
  "(": ")",
  ")": "(",
  "]": "[",
  "[": "]",
  "<": ">",
  ">": "<"
}

for (let emoticon of emoticons) {
  patterns.push(emoticon);
  let reverse = [...emoticon].reverse();
  for (let char in reverse) {
    reverse[char] = REVERSE_SWAP[reverse[char]] || reverse[char];
  }
  patterns.push(reverse.join(""));
}

patterns = patterns.map(pattern => {
  return pattern.replace(/([\/\\\|\(\)*])/g, (match => {
    return "\\" + match;
  }));
});

var regex = new RegExp("/(" + patterns.join("|") + ")/g");

这将生成以下 RegEx 模式:

/(:-\)|\(-:|\*<\|:-\)|\(-:\|>\*)/g

【讨论】:

  • 如果我尝试匹配的表情符号数量较少,这将起作用,但我正在匹配其中的 500 个,并且我已经有了正则表达式。不过还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多