Javascript:我如何滥用正则表达式构造函数?

Javascript:我如何滥用正则表达式构造函数?

问题描述:

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

我期待结果“slayers得到米”,而是我得到空?Javascript:我如何滥用正则表达式构造函数?

键入regexp文字可以工作。

另一个问题:我如何才能让它匹配整个单词,这样的结果将是“slayers得到”?

THX

+1

新关键字缺少'new RegExp' – Musa 2012-08-02 03:37:12

+0

谢谢,但这没有帮助。我确实有'新'关键字,并删除它,看看它会改善什么。插入它不会产生预期的行为... – 2012-08-02 03:47:02

+0

'匹配(新的RegExp(“^”+“slayers得到魔法”,“g”))' – Musa 2012-08-02 03:48:31

"g"应该是RegExp()的第二个参数,而不是.match()的第二个参数。 (虽然你的正则表达式开始用^从字符串的开头匹配你不需要"g"在所有。)

除了这将是“更正确”使用new如下:

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

但是,我相信在RegExp()的情况下,它可以使用或不使用new

'我期待结果“slayers得到米”,而是我得到空?

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")); 

“另一个问题是:我如何让它只匹配整个单词,这样的结果将是‘秀逗得’?“

建立在同样的想法,我以前的功能,只是在一个时间比较一个字:

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(" "); 
} 

这种分裂两个字符串成单个单词,一个单词在一个时间进行比较,直到有是不匹配的,并返回匹配到该点的单词(如果没有匹配,则返回空字符串)。

DEMO:http://jsfiddle.net/j8zsU/1/

+0

谢谢。我正在寻找一种不必手工操作的方式,但我认为这正是像正则表达式这样的东西。 :) – 2012-08-02 08:05:15

你有两个问题:

  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")) 

,那么你会得到你期待的结果。

你的问题是怎么算的正则表达式的工作的误解。你的正规魔术师“魔法师”所说的是在字符串的开头寻找“slayers gets magic”的短语。这意味着除非你的字符串的开头是完全匹配的,否则它将返回null。你需要做的是让每一个字都是可选的,这样可以删除不匹配的单词。 (我不是一个正则表达式的专家,我真的建议通过this site阅读,这是一个很大的正则表达式资源)

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

该代码添加可选的操作(?)围绕每一个字,这样的比赛将匹配的内容可用。这返回:

["slayers get "] 

而不是null。

+0

这对我没有用,因为程序员不知道字符串。我在排除故障的同时将其减少为字符串文字,但这不是实时代码将使用的内容。 – 2012-08-02 04:03:01

+1

@abeisgreat - 你的正则表达式是否也会匹配''slayers magic'''?或者只是“魔术”。 – nnnnnn 2012-08-02 04:13:36