2011-12-15 59 views
0

我现在有一个javascript文件的正则表达式:更改正则表达式只接受指定的字符?

function (value) { 
    regex = new RegExp("[\<|\>|\"|\'|\%|\;|\(|\)|\&|\_|\.]", "i"); 
    return !regex.test(value); 
} 

胜于指定不准什么角色,我怎么能说出允许哪些角色?我想要的字符是a-z A-Z 0-9(也是实际的字符“ - ”,但不在开始或结束处,仅在中间)。先谢谢了。

+0

对不起,还应该有最少6个字符输入请...目前,它混淆哪个答案是正确的,因为每个答案都有一票! – 2011-12-15 22:28:16

+0

我用最小6字符解决方案更新了我的答案 – stema 2011-12-15 22:34:19

+0

对于长度要求,为什么不测试字符串的长度,如果正则表达式匹配?看到我的答案。 – fge 2011-12-15 22:35:17

回答

3

regex = new RegExp("^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$");

再次古典 “正常*(特殊正常*)*” 模式)

函数体变为:

function (value) { 
    regex = new RegExp("^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$"); 
    return regex.test(value) && value.length >= 6; 
} 

编辑地:分组非捕获因为这里没有捕获完成

1

在开始或结束时没有破折号的限制使得正则表达式更加复杂一些。下面的正则表达式首先匹配单个字符,然后它可以选择匹配零个或多个字符,包括短划线,然后结束于非短划线字符。

/^[a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?$/ 
+0

不,完全没有:看看我的回答 – fge 2011-12-15 22:21:18

1

试试这个

regex = new RegExp("^(?!-)[a-z0-9-]*[a-z0-9]$", "i"); 

^锚字符串

(?!-)开始负前瞻确保字符串不以破折号

[a-z0-9-]* 0个或更多字符的类中开始

[a-z0-9]$以类别中的字符结尾

看到此regex here on Regexr

更新

这是使用两个向前看符号的变体,这也将接受空字符串

^(?!-)(?!.*-$)[a-z0-9-]*$ 

See it on Regexr

更新2:最小6个字符

^(?!-)[a-z0-9-]{5,}[a-z0-9]$ 

See it on Regexr

为了对付评论

它实际上是太复杂正则表达式 - 绝对速度低于 我正则表达式

我做了一个小的基准(在Perl,不该没什么大不了的)

sub WithLookahead($) { 
    my $string = shift; 

    return $string =~ /^(?!-)[a-z0-9-]*[a-z0-9]$/i; 
} 

sub WithOutLookahead($) { 
    my $string = shift; 

    return ($string =~ /^[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*$/ 
      && length($string) >= 6); 
} 

sub BenchmarkLookahead($) { 
    use Benchmark; 
    my $testString = shift; 

    my $t0 = Benchmark->new; 
    for (0 .. 10000000) { 
     my $result = WithLookahead($testString); 
    } 
    my $t1 = Benchmark->new; 

    my $t2 = Benchmark->new; 
    for (0 .. 10000000) { 
     my $result = WithOutLookahead($testString); 
    } 
    my $t3 = Benchmark->new; 

    my $tdWith = timediff($t1, $t0); 
    my $tdWithOut = timediff($t3, $t2); 
    print "the code with Lookahead and test string \"$testString\" took:", timestr($tdWith), "\n"; 
    print "the code without Lookahead and test string \"$testString\" took:", timestr($tdWithOut), "\n"; 
} 

结果

与先行和测试字符串“富酒吧”的代码把:16挂钟秒(14.94 USR + 0.00 SYS = 14.94 CPU)
没有先行和测试字符串“富酒吧”的代码采用:18 wallclock secs(17.50 usr + 0.02 sys = 17.52 CPU)
带Lookahead和测试字符串“-Foo-Bar”的代码采用:13 wallclock秒(12.03 usr + 0.00 sys = 12.03 CPU)
代码无Lookahead和测试字符串“-Foo-Bar”采用:14时钟秒(13.44 usr + 0.00 sys = 13。44 CPU)
带有Lookahead和测试字符串“Foo-Bar-”的代码采用了:17 wallclock秒(15.28 usr + 0.00 sys = 15.28 CPU)
没有Lookahead的代码和测试字符串“Foo-Bar-” 23 wallclock secs(21.61 usr + 0.02 sys = 21.63 CPU)
Lookahead和测试字符串“Foo”的代码采用:14 wallclock秒(13.70 usr + 0.00 sys = 13.70 CPU)
代码没有Lookahead和测试字符串“富”了:19挂钟秒(17.09 USR + 0.02 = SYS 17.11 CPU)

所以,总体来说我与负向前查找正则表达式是不是一个简单的正则表达式的组合更快结合一个外耳炎位l长度检查。但是我需要调用每个代码10000000次才能获得显着的结果,所以我不认为它是一个使用哪个性能决策的决定。