这个正则表达式如何工作?

时间:2014-12-30 19:12:58

标签: javascript regex

RegExes让我头疼。我有一个非常简单的regex,但我不明白它是如何工作的。

代码:

var str= "startBlablablablablaend";
var regex = /start(.*?)end/;
var match = str.match(regex);
console.log( match[0] ); //startBlablablablablaend
console.log( match[1] ); //Blablablablabla

我最终想要的是第二个,换句话说,两个分隔符之间的文本(开始,结束)。

我的问题:

  • 它是如何工作的? (请说明每个角色)
  • 为什么它匹配两个不同的东西?
  • 有没有更好的方法来获得比赛[1]?
  • 如果我想在所有起始实例之间获取所有文本,我将如何处理它?<​​/ li>

对于最后一个问题,我的意思是:

var str = "startBla1end startBla2end startBla3end";
var regex = /start(.*?)end/gmi;
var match = str.match(regex);
console.log( match ); // [ "startBla1end" , "startBla2end" , "startBla3end" ]

我需要的是:

console.log( match ); // [ "Bla1" , "Bla2" , "Bla3" ];

谢谢:)

3 个答案:

答案 0 :(得分:4)

它是如何运作的?

  • start匹配字符串

  • 中的start
  • (.*?)非贪婪的角色匹配

  • end匹配字符串中的结尾

匹配

startBlablablablablaend
  |
start

startBlablablablablaend
     |
     .

startBlablablablablaend
      |
      .

# and so on since quantifier * matches any number of character. ? makes the match non greedy

startBlablablablablaend
                     |
                    end

为什么它会匹配两个不同的东西?

它不匹配2个不同的东西

  • match[0]将包含整个匹配

  • match[1]将包含第一个捕获组(在第一个paranthesis中匹配的部分)

是否有更好的方法来获得匹配[1]?

简短回答否

如果您使用的是javascript以外的语言。它可能使用环顾四周

(?<=start)(.*?)(?=end)
#Blablablablabla

注意这不适用于javascript,因为它不支持负面的背后隐藏

上一个问题

从单个匹配声明中获得的最佳效果是

var str = "startBla1end startBla2end startBla3end";
var regex = /start(.*?)(?=end)/gmi;
var match = str.match(regex);
console.log( match ); // [ "startBla" , "startBla2" , "startBla3" ]

答案 1 :(得分:1)

你不需要做太多努力。

试试这个正则表达式:

start(.*)end

您可以查看之前已经回答的stackoverflow问题。

Regular Expression to get a string between two strings in Javascript

希望它有所帮助。

答案 2 :(得分:1)

要解决上一个问题,您可以拆分字符串并进行迭代:

var str = "startBla1end startBla2end startBla3end";
var str_array = str.split(" "); 

然后使用现有代码遍历str_array的每个元素,以提取每个Bla#substring。

相关问题