我有一个有效的Python正则表达式语句:
regex = re.compile(r"(?<=(==))(.*)(?=(==))")
myList = regex.findall(contents)
对于上下文,输入字符串可能类似于(例如):
== Test User ==
Comment here
== Test User 2 ==
Comment here
我希望在下面的行中提取用户名和相关评论。
我想在我的Javascript程序中使用这个正则表达式,但Javascript缺乏后视功能。
是否有合适的解决方法?
答案 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演示:
{{1}}&#13;