我不明白用于分割多行的模式

时间:2013-02-24 11:35:37

标签: javascript regex

在以下代码段中,任何人都可以解释reg如何定义?

str = "This is the first line.\n" + 
      "This is the second line.\n" + 
      "This the third line.\n";
reg = /^.*$/gm;

var mtch = str.match(reg);

需要拆分单独一行的三个句子,但我不理解为拆分它而定义的模式。

它说(我猜是这样!)字符串应该开始,..可以多次出现。当我们实际放置*时需要放置global flag

4 个答案:

答案 0 :(得分:3)

“m”标志告诉javascript在换行符的开头和结尾都有^和$ anchors匹配。因此,此正则表达式匹配包含在一行中的任何字符0次或更多次的所有情况(“g”标志)。

答案 1 :(得分:3)

全球多线匹配

g修饰符仅表示返回所有匹配的字符串

m修饰符最好由the docs解释:

  

将开始和结束字符(^和$)视为多行(即匹配每行的开头或结尾(由\ n或\ r分隔),而不仅仅是整个输入的开头或结尾)字符串)

因此,问题中的正则表达式匹配换行符之间的所有字符串。

str = "This is the first line.\n" + 
  "This is the second line.\n" + 
  "This the third line.\n";

str.match(/^.*$/gm)
//["This is the first line.", "This is the second line.", "This the third line.", ""]

m修饰符不需要

开始和结束锚点实际上并不是必需的;因为这样一个更简单,几乎等同的正则表达式将是:

str.match(/.+/g)
//["This is the first line.", "This is the second line.", "This the third line."]

在这种情况下,.+将匹配换行符之外的任何一个或多个字符的字符串。默认情况下,正则表达式中的匹配项是贪婪的,并且会扩展为尽可能匹配,因此它会将字符串拆分为行。请注意,响应中没有空字符串。

这不需要正则表达式

为了这个正则表达式的目的,最好不要使用正则表达式:

str.split("\n");
//["This is the first line.", "This is the second line.", "This the third line.", ""]

答案 2 :(得分:1)

  

当我们实际放置全局标志时需要放*?

*是模式的一部分(用于匹配),g是一个修饰符,意思是“所有结果,而不仅仅是第一个结果。”

/^.$/m;会返回一行只包含一个字符(找到的第一个字符)

/^.*$/m;会返回一行(找到的第一行)

/^.$/gm;将返回每行只有一个字符

/^.*$/gm;返回每一行

答案 3 :(得分:0)

点(。)表示任何字符。 *表示0或更多。 'm'修饰符是多行的。