正则表达式允许字母数字字符,最多一个空格等。
正则表达式允许字母数字字符,最多一个空格等。
我开了一个与另一个帖子非常相似但我无法找出问题的线程:
我有一个输入字段,允许包含一个可选的唯一空格作为分隔符的字母数字字符串,然后是一个可选的其他字母数字字符串等等...
我找到了这个正则表达式:
^([0-9a-zA-z]+ ?)*$
它有效!但是当我在一个长句子中有两个连续的空格并且这两个空格位于句子中较远的位置时,性能非常差。
在下面的示例中,如果我把这两个空格放在句子开头,结果在半秒钟内就可以得到。
但是如果它们位于较远的位置,那么需要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
这两个空格在999
之后。
你有任何想法或建议来改进这个正则表达式吗?
谢谢和问候
PF
附言:只要您在字符串中输入一个无效字符,而不一定是两个空格,您就可以验证此问题。
编辑:另一个例子:
12345678901234567890' ==> 20个字符+1个无效字符=>结果立即得到
添加5个有效字符,执行正则表达式需要5秒钟!
1234567890123456789012345'
问题出现的原因是作者想要创建一个正则表达式,以允许字母数字字符和最多一个空格。然而,作者给出的第一个正则表达式并不符合他的需求,因此他决定在.NET中进行测试,以查看性能是否更好。作者还指出,在使用词类\w时需要注意,因为它包括预期的a-z、A-Z和0-9字符,但也包括下划线字符_,这与定义的类[a-z0-9A-Z]不同。最后,作者提到他在javascript中遇到了相同的问题。
为了解决这个问题,作者需要修改正则表达式,以满足他的需求。他可以尝试以下正则表达式:
^([a-zA-Z0-9]+(\s?))*$
这个正则表达式允许字母数字字符和最多一个空格,满足作者的需求。作者可以在他的代码中使用这个正则表达式来替换匹配的部分。
问题描述:如何使用正则表达式匹配只允许包含字母和数字,最多一个空格等条件的字符串。
解决方法:建议将原有的正则表达式改为如下形式:(?i)^[0-9a-z]+(?:\s[0-9a-z]+)*$。此表达式与原表达式功能上相似,可以匹配由单个空格分隔的所有字母和数字。主要的区别是将初始的单词检查移到了表达式的最前面,然后使用非捕获组(?:...)来匹配剩余的以空格分隔的词。
非捕获组(?:...)比捕获组(...)更快,因为正则引擎不需要保留匹配的值。通过将空格\s移动到重复的词组的前面,引擎不需要验证词组中的第一个字符是否包含在字符类中。
此外,原字符类[0-9a-zA-z]中存在一个拼写错误,最后一个z应该是大写字母。这种格式A-z可能会导致一些奇怪的、意外的结果。在我的表达式中,我只需在开头添加(?i)来强制正则引擎进入不区分大小写的模式,并将字符类改为[0-9a-z]。
经过测试,我发现你的表达式^([0-9a-z]+ ?)*$在处理包含2个额外空格的示例文本时大约需要0.03秒。而我推荐的表达式在相同的测试中只需约0.000022秒。这个差距非常惊人。
另外,关于如何生成图片的问题,我使用的是myregextester.com这个网站。它没有花哨的功能,需要一些时间来适应,但我喜欢它简单明了的布局。当你在结果标签页中填写你的表达式和源文本后,可以看到执行时间。如果你连续点击提交几次,你就可以大致估计出平均时间。
还有一个网站是debuggex.com,它虽然不支持lookbehinds、命名捕获组或原子组,但对于理解表达式的流程还是很有帮助的。另外还有regexper.com,它也做得很好,但不支持实时输入。
总之,感谢大家的帮助!你们的正则表达式很完美,我也从中学到了很多东西。还有一个问题:你们是如何生成图片的?