捕获正则表达式的反向匹配

时间:2016-01-02 19:13:22

标签: python regex

我有一个匹配表情符号的正则表达式,如:-),*< | :-)等。

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

看起来前瞻,后视和外观断言不会成功,因为这些都是非捕获的。有没有一种简单的方法可以反转正则表达式,而不必以相反的顺序完全重写它?

谢谢!

1 个答案:

答案 0 :(得分:0)

更好的解决方案可能是使用您正在使用的语言生成正则表达式模式,这样您就不必手动创建每个表情符号向后和向前。例如,在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