0
_("test1: "+ ("slayers get more".match(RegExp("^" + "slayers get magic"), "g")));

我期待结果“slayers get m”,但我得到了 null?

键入正则表达式文字确实有效。

另一个问题:我如何让它只匹配整个单词,以便结果是 "slayers get" ?

谢谢

4

3 回答 3

2

"g"应该是 的第二个参数,RegExp()而不是 的第二个参数.match()。(尽管您的正则表达式以 a^开头,以匹配您根本不需要的字符串的开头"g"。)

此外,new如下使用会“更正确”:

_("test1: "+ ("slayers get more".match(RegExp("^" + "slayers get magic", "g"))));

但是我相信RegExp()无论有没有new.

'我期待结果'slayers get m',但我得到了null?'

null是该字符串和该正则表达式的正确结果,因为它不匹配. 也就是说,正则表达式要么匹配要么不匹配(在这种情况下不匹配),它不会返回进行部分匹配的字符串部分。

看起来您真正想要做的是返回与第二个字符串的开头匹配的第一个字符串的那部分,直到但不包括第一个不同的字符。如果是这样,试试这个:

function getCommon(s1,s2) {
   var i = 0, len = s1.length;
   while (i < len && s1.charAt(i) === s2.charAt(i))
      i++;
   return s1.substr(0,i);
}

_("test1: "+ getCommon("slayers get more", "slayers get magic"));

“另一个问题:我如何让它只匹配整个单词,这样结果就是“slayers get”?

基于与我之前的函数相同的想法,一次只比较一个单词:

function getCommon(s1,s2) {
   var a1 = s1.split(" "),
       a2 = s2.split(" "),
       len = a1.length,
       i = 0;
   while (i < len && a1[i] === a2[i])
      i++;
   return a1.slice(0,i).join(" ");
}

这会将两个字符串拆分为单独的单词,一次比较一个单词直到出现不匹配,然后返回匹配到该点的单词(如果没有匹配,则返回空字符串)。

演示:http: //jsfiddle.net/j8zsU/1/

于 2012-08-02T03:53:51.180 回答
0

你有两个问题:

  1. match只需要一个参数,但您要传递两个参数。我认为您想将 传递"g"RegExp构造函数:new RegExp("^" + "slayers get magic", "g")
  2. "slayers get more"字符串与正则表达式不匹配,/^slayers get magic/因此当然match返回null

如果你这样做:

"slayers get more".match(new RegExp("^" + "slayers get m"))

然后你会得到你期望的结果。

于 2012-08-02T03:53:17.567 回答
0

您的问题是对正则表达式运算符如何工作的误解。你的正则表达式“^slayers get magic”说的是在字符串的开头寻找短语“slayers get magic”。这意味着除非字符串的开头完全匹配,否则它将返回 null。你需要做的是让每个单词都是可选的,这样它就可以删除不匹配的单词。(我不是正则表达式专家,我真的建议阅读这个网站,这是一个很棒的正则表达式资源)

"slayers get more".match(RegExp("^(slayers)? (get)? (magic)?", "g"))

此代码在每个单词周围添加可选操作 (?),以便匹配匹配可用的内容。这将返回:

["slayers get "]

而不是空值。

于 2012-08-02T03:56:52.483 回答