3

我今天一直在学习一些 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);
4

3 回答 3

1

来自MDN

\w

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

例如,/\w/匹配'a'in 和"apple," '5'in"$5.28,"'3'"3D."

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

于 2012-12-08T03:22:19.863 回答
1

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

因此这/([\w]+)\b/部分正则表达式只匹配到 word 的结尾'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',因为它不是 'word character' 的字符串,而是'space' + string of '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/

于 2012-12-08T04:26:06.843 回答
1

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

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

我认为最好把这个明确地写进去,而不是 \b。

于 2012-12-08T08:54:59.350 回答