将regexp从php转换为javascript(lookback断言)

时间:2018-02-22 21:42:32

标签: javascript regex

我有这个正则表达式将嵌入的RGB颜色{rrggbb}(总是用大括号括起来的6个字符)替换为html span标记: {([a-fA-F0-9]+)}((?>[^{]*{?(?!(?1)}))*)

它的使用方式如下:

preg_replace('~{([a-fA-F0-9]+)}((?>[^{]*{?(?!(?1)}))*)~', '<span style="color: #$1">$2</span>', $text);

它在php中的preg_replace运行良好,但是当试图在javascript中使用它时,我收到语法错误(?前面的标记无法量化)

如何让它在javascript中运行?

注意我还有另一个正则表达式:{([a-fA-F0-9]{6})\}([^\{]+),但如果我执行以下操作:{ff0000}red text {some text that isn't a color} {00ff00}blue text我的输出结果为:<span style="color: #ff0000">red text </span>{some text that isn't a color} <span style="color: #00ff00">blue text</span>,请注意{{1} }未包含在任何{some text that isn't a color}标记中,但它仍应位于上一个标记中。我不知道如何解决它。

1 个答案:

答案 0 :(得分:1)

JS regexp不支持子例程,但您可以将块定义为变量,并动态构建模式。此外,(?>[^{]*{?(?!(?1)}))*部分过于神秘(并且包含JS RegExp不支持的原子组(?>...)),它所做的只是匹配{{1以外的任何0+字符没有跟随十六进制字符一直到结束{,依此类推到RGB模式(一种unroll-the-loop原则变体)。

JS等效于

}

使用的模式是

var s = "{ff0000}red text {some text that isn't a color} {00ff00}blue text";
var xdigit = "[a-fA-F0-9]+";
var result = s.replace(new RegExp("{("+xdigit+")}([^{]*(?:{(?!"+xdigit+"})[^{]*)*)", "g"), '<span style="color: #$1">$2</span>');
console.log(result);

请参阅JS regex demo here

  • /{([a-fA-F0-9]+)}([^{]*(?:{(?![a-fA-F0-9]+})[^{]*)*)/g - {字符
  • { - 第1组:一个或多个(使用([a-fA-F0-9]+)仅匹配6)十六进制字符
  • {6} - }字符
  • } - 第2组:
    • ([^{]*(?:{(?![a-fA-F0-9]+})[^{]*)*) - 除[^{]*
    • 以外的任何0 +字符
    • { - 以下一系列模式出现零次或多次:
      • (?:{(?![a-fA-F0-9]+})[^{]*)* - {即......
      • { - 未跟随1+十六进制字符,然后是(?![a-fA-F0-9]+})
      • } - 除[^{]*
      • 以外的任何0 +字符