2017-07-06 44 views
1

我有一个工作的Python正则表达式语句:解决方法缺乏向后看Javascript的正则表达式

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

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

== Test User == 
Comment here 

== Test User 2 == 
Comment here 

而且我希望提取用户名和下面相关的注释。

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

有没有适合此方法的解决方法?

+0

不Python的溶液产生的元组'( '==', '一些值',' ==')'?你需要复制那个吗? –

+0

@你完全正确@WiktorStribiżew,但我不需要复制这种确切的行为,只是能够检测用户名和评论。 – Masutatsu

+0

这意味着你的初始解决方案不适合你,对吧?参见['== \ s *(。*?)\ s * == \ s *([\ s \ S] *?)(?= \ n == | $)'](https:// regex101。可以捕获这两种类型的信息。 –

回答

1

的标准方法是同时匹配了回顾后和所需的数据,并使用捕获组,做你想做什么:

  • 如果是检索数据,然后把它放在一个捕获组你将在每场比赛后进行咨询

  • 如果要转换数据,您至少需要在捕获组中使用“lookbehind”,以便您可以在输出中重现该数据,并且可能需要的数据参考它。

例子:

# 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]); 
} 
0

你并不需要在这里任何回顾后,即使在Python中,你可以摆脱它并使用以下表达re.findall(只除去//gmre.M标志编译):

/^==\s*(.*?)\s*==\s*(.*(?:\r?\n(?!\r?\n).*)*)/gm 

regex demo

详细

  • ^ - 串的开始
  • ==\s* - 2个=符号,然后0+空格
  • (.*?) - 第1组捕获比换行符字符作为其他任何0+字符尽可能少的到第一次出现的后续子模式
  • \s*==\s* - 两个= s包围0+空格
  • (.*(?:\r?\n(?!\r?\n).*)*) - 组2捕获
    • .* - 该行的其余部分
    • (?:\r?\n(?!\r?\n).*)* - 的
      • \r?\n(?!\r?\n)零个或更多序列 - 一个CRLF或LF(换行)不跟随LF或CRLF(另一个换行符)
      • .* - 除换行符字符(整行)以外的任何0+字符。

JS演示:

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]); 
 
}