缺乏Javascript正则表达式后视的解决方法

时间:2017-07-06 13:53:29

标签: javascript regex python-3.x

我有一个有效的Python正则表达式语句:

regex = re.compile(r"(?<=(==))(.*)(?=(==))")    
myList = regex.findall(contents)

对于上下文,输入字符串可能类似于(例如):

== Test User ==
Comment here

== Test User 2 ==
Comment here

我希望在下面的行中提取用户名和相关评论。

我想在我的Javascript程序中使用这个正则表达式,但Javascript缺乏后视功能。

是否有合适的解决方法?

2 个答案:

答案 0 :(得分:1)

标准方法是匹配lookbehind和所需数据,并使用捕获组来执行您想要的操作:

  • 如果要检索数据,然后将其放入捕获组,您将在每场比赛后进行咨询

  • 如果要转换数据,您至少需要拥有&#34; lookbehind&#34;在捕获组中,您可以在输出中重现它,如果需要引用它,也可以是所需的数据。

示例:

# in these examples, we look for "overflow" preceded by "stack"
"stackoverflow".match(/stack(.*)/)[1]                // -> overflow
"stackoverflow".replace(/(stack).*/, "$1underflow")  // -> stackunderflow
"stackoverflow".replace(/(stack)(.*)/,"$2ed $1")     // -> overflowed stack

我们在JavaScript的正则表达式实现中遇到的另一个问题是String.prototype.match的行为不一致:它通常会返回类似于捕获的组数组的对象,但是如果你的正则表达式指定g lobal标志,它将返回一个(字符串)匹配数组,并且捕获组的详细信息将丢失。

要解决此问题,您可以改为使用Pattern.prototype.exec方法:

var pattern = /==\s*([^=]+)/g;
var input = `== Test User ==
Comment here

== Test User 2 ==
Comment here`;
while (match = pattern.exec(input)) {
    console.log(match[1]);
}

答案 1 :(得分:0)

这里你不需要任何lookbehind,即使在Python中你可以摆脱它并使用/gm的以下表达式(只需删除re.M/^==\s*(.*?)\s*==\s*(.*(?:\r?\n(?!\r?\n).*)*)/gm 并使用{{进行编译1}} flag):

^

请参阅regex demo

<强>详情:

  • ==\s* - 字符串开头
  • = - 两个(.*?)符号,然后是0 +空格
  • \s*==\s* - 第1组捕获除了换行符之外的任何0+字符,直到第一次出现的后续子模式为止
  • = - 包含0 +空格的两个(.*(?:\r?\n(?!\r?\n).*)*)
  • .* - 第2组捕获
    • (?:\r?\n(?!\r?\n).*)* - 其余部分
    • \r?\n(?!\r?\n) - 零个或多个序列
      • .* - CRLF或LF(换行符)未跟随LF或CRLF(另一个换行符)
      • var s = `== Test User == Comment here, one line only == Test User 2 == Comment here with line 2`; var rx = /^==\s*(.*?)\s*==\s*(.*(?:\r?\n(?!\r?\n).*)*)/gm; var results = [], m; while(m=rx.exec(s)) { console.log("--- New match found ---"); console.log("User:", m[1]); console.log("Comment:", m[2]); } - 除了换行符之外的任何0 +字符(整行)。

JS演示:

&#13;
&#13;
{{1}}
&#13;
&#13;
&#13;