正则表达式允许字母数字,最大一个空格等

时间:2013-06-20 15:47:17

标签: .net regex expression

我打开这个与另一个非常类似的线程,但我无法找出问题: 我有一个输入字段,允许带有可选唯一空格的字母数字字符串作为分隔符,然后是可选的其他字母数字字符串等.... 我发现这个正则表达式:

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

有效!但是,只要我在一个长句子中有2个连续的空格并且这两个空格位于句子的远处,表现就非常糟糕。 在下面的例子中,如果我在句子的开头放置2个空格,结果在半秒内就可以了。 但如果距离很远,它会持续10秒或更长时间。

  

dzdff5464zdiophjazdioj ttttttttt zoddzdffdziophjazdioj ttttttttt   zoddzdffdzdff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt   zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt   zoddzdfff ttttt zo999 ddzdfff ttttt zoddzdfff ttttt zoddzdff

2个空格位于999之后。 你对改进这个正则表达式有什么想法或建议吗?

谢谢和问候

PF

ps:您可以在字符串中输入无效字符后立即检查问题,而不是特别是2个空格。

编辑:另一个例子: 12345678901234567890'==> 20个字符。 + 1个无效的字符。 =>结果立竿见影 添加5个有效字符。它持续5秒执行正则表达式! 1234567890123456789012345'

2 个答案:

答案 0 :(得分:1)

我建议将表达式更改为:

(?i)^[0-9a-z]+(?:\s[0-9a-z]+)*$

enter image description here

这在功能上类似,它将匹配由单个空格分隔的所有字母数字字符。一个主要区别是我将初始单词检查移到了表达式的前面,然后为剩余的空格分隔单词创建了一个非捕获组(?: ... )

非捕获组(?: ... )比捕获组( ... )快,因为正则表达式引擎不需要保留匹配的值。通过在重复单词上将空格\s移动到单词组的前面,引擎不需要验证组中的第一个字符是否包含在字符类中。

您的角色类[0-9a-zA-z]中也有拼写错误,最后z可能是大写字母。这种A-z格式可能会产生一些奇怪的意外结果。在我的表达式中,我只是在开头添加了一个(?i)来强制正则表达式引擎转换为不区分大小写的模式,并将字符类删除到[0-9a-z]

在我的测试中,我发现你的表达式^([0-9a-z]+ ?)*$需要大约0.03秒来处理你的示例文本,最后有2个额外的空格。我推荐的表达式在大约0.000022秒内完成相同的测试。哇,这是一个惊人的三角洲。

答案 1 :(得分:0)

这是一个使用\wword class)的简单正则表达式:

^([\w]+(\s*))$

测试

它在JavaSript中是即时的

var input = "dzdff5464zdiophjazdioj ttttttttt zoddzdffdziophjazdioj ttttttttt  zoddzdffdzdff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt  zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt zoddzdfff ttttt  zoddzdfff ttttt zo999  ddzdfff ttttt zoddzdfff ttttt zoddzdff";

var re = /([\w]+(\s*))/g;

console.log(input.replace(re, "boo"));