2010-11-18 99 views
0

我在php中使用此代码来检测字符串中是否有五个相同的符号在一行中并执行一些代码,如果它。正则表达式在javascript中搜索

function symbolsInRow($string, $limit = 5) { 
    $regex = '/(.)\1{'.($limit - 1).',}/us'; 
    return 0 == preg_match($regex, $string); 
} 

现在我需要在JavaScript中做同样的事情,但不幸的是我不够熟悉它。这个函数怎样才能转换成javascript?如果函数在给定的字符串中找到5个相同的符号,该函数应该返回false。

回答

1

在这里你去,如果找到匹配

function symbolsInRow(string, limit) { 
    // set the parameter to 5 if it is not provided 
    limit = (limit || 5); 

    // create a regexp object, initialized with the regex you want. we escape the \ with \\ because it is a special char in javascript strings. 
    var regex = new RegExp('(.)\\1{'+(limit-1)+',}'); 

    // return false if we find a match (true if no match is found) 
    return !regex.test(string); 
} 

实际test方法将返回true。因此,请注意!这是not运算符对测试结果的反转,因为如果找到序列就想返回false。

例如在http://www.jsfiddle.net/gaby/aPTAb/

+0

为什么'g'修饰符? – 2010-11-18 15:07:55

+0

@Victor,以防万一在字符串中有换行符。 – 2010-11-18 15:33:12

+1

换行符? 'g'与换行符无关。 – jwueller 2010-11-18 17:59:10

1

可以用正则表达式是不是:

function symbolsInRow(str, limit, symbol){ 
    return str.split(symbol).length === limit + 1; 
} 
+0

我宁愿使用正则表达式,如果它是可能的,因为我需要单独执行每个符号的检查做。字符串中的任何符号都不应该连续使用五次以上,但可以在不同位置使用任意数量的符号。例如,这个“somethiiiiiiiiing”应该返回false,但“somethininininining”不应该... – 2010-11-18 14:51:07

+1

原始问题要求任何**符号(也就是说,你不能指望调用者知道“符号”是什么。 ..)在连续**中重复五次**(所以'aaa-aa'不会返回'true')。 – 2010-11-18 14:55:31

+0

在我的法语口语大脑中,从“连续”到“sur une ligne”的错误翻译... – Mic 2010-11-18 15:05:28

1

这应该是等价的:连续

function symbolsInRow(string, limit) { 
    limit = (limit || 5) - 1; 
    return !(new RegExp('(.)\\1{'+limit+'}')).test(string); 
} 
+0

在Javascript正则表达式中,修饰符“u”是不必要的,'s'是默认值(必须使用' m'回到多线模式)。 – 2010-11-18 14:51:56

+0

@Victor Nicollet:那是对的。我已经修好了。 – jwueller 2010-11-18 14:52:36

+0

现在你需要把'\'变成'\\';) – 2010-11-18 14:56:43

0

五年,区分大小写,这应该工作:

function symbolsInRow(string) { 
    return /(.)\1{4}/.test(string); 
} 

如果您需要匹配任意数量的重复:

function symbolsInRow(string,limit) { 
    return (new RegExp('(.)\\1{'+limit+'}')).test(string); 
}