我今天学习了一些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);
答案 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。