这个JS正则表达式中空间的意义?

时间:2012-12-08 03:18:44

标签: javascript regex

我今天学习了一些Javascript正则表达式,但我无法理解以下代码的工作原理。

var toswop = 'last first\nlast first\nlast first';
var swapped = text.replace(/([\w]+)\b([\w ]+)/g,'$2 $1');
alert(swapped);

它正确地将交换的单词警告到正确的顺序,但是下面的代码(注意第二个\ w后面缺少的空格)不起作用。它只是按原始顺序打印出来。

var toswop = 'last first\nlast first\nlast first';
var swapped = text.replace(/([\w]+)\b([\w]+)/g,'$2 $1');
alert(swapped);

3 个答案:

答案 0 :(得分:1)

来自the MDN

  

\w

     

匹配包括下划线在内的任何字母数字字符。相当于[A-Za-z0-9_]

     

例如,/\w/'a' "apple," '5'中的"$5.28,"匹配   和'3'

中的"3D."

添加空格时,将字符集从字母数字和下划线更改为字母数字,下划线和空格。

答案 1 :(得分:1)

我认为您错误地使用'\b'来匹配空格,但在JavaScript中,正则表达式'\b'与单词的开头或结尾匹配。

因此,正则表达式的/([\w]+)\b/部分仅匹配单词'last'的结尾。剩下的字符串是' first'(注意开头的空格)。

然后,为了匹配余数,您需要此([\w ]+),这将转换为'任意字符或空格字符的一次或多次出现'。这正是我们需要与剩余字符串' first'匹配的内容。

您可以注意到,即使交换了单词,单词'first'前面也有一个空格。

为了进一步证明这一点:假设您将输入更改为:

var toswop = 'last first another\nlast first another\nlast first another';

您可以看到已交换的文字变为

 first another last
 first another last
 first another last 

这是因为正则表达式([\w ]+)的最后一段与空格和单词字符保持匹配,并在匹配中包含“另一个”一词。

但是如果你从方括号中移除空格,那么它将与剩余的' first'不匹配,因为它不是字符串'字符',而是 'space'+'word character'字符串

这就是为什么你的空间很重要。

但如果你改变你的正则表达式:

swapped = toswop.replace(/([\w]+)\s([\w]+)/g,'$2 $1');

然后它没有空间,因为中间的\s与两个单词中间的空格匹配。

希望这能澄清你的问题。

请参阅此处了解JavaScript RegEx语法:http://www.w3schools.com/jsref/jsref_regexp_begin.asp

如果您想要进行更多实验,请在此处查看我的小提琴:http://jsfiddle.net/BuddhiP/P5Jqm/

答案 2 :(得分:1)

它经历了这样的表达。它将查找所有单词字符,直到找到非单词字符。这抓住了第一个字。

然后它会查找下一个匹配的空格或单词字符。因此,如果方括号中没有空格,则名称中的空格不匹配。这就是为什么没有空间的替​​代方案就失败了。

我认为最好明确地将空间写入而不是\ b。