我昨天做了评论,其中有人曾用一个答案[0123456789]的正则表达式,而不是[0-9]或\d.我说使用范围或数字说明符比使用字符集更有效.
我决定今天测试一下,并且我惊讶地发现(至少在C#正则表达式引擎中)\d似乎效率低于其他两个似乎没有太大差别的.这是我的10000个随机字符串1000个随机字符的测试输出,其中5077实际上包含一个数字:
Regular expression \d took 00:00:00.2141226 result: 5077/10000
Regular expression [0-9] took 00:00:00.1357972 result: 5077/10000 63.42 % of first
Regular expression [0123456789] took 00:00:00.1388997 result: 5077/10000 64.87 % of first
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是有两个原因:
\d会比这更糟糕[0-9].还有\d简单的简写[0-9]吗?这是测试代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Text.RegularExpressions;
namespace SO_RegexPerformance
{
class Program
{
static void Main(string[] args)
{
var rand = new …Run Code Online (Sandbox Code Playgroud) 我正在使用正则表达式为一个文本框编写输入验证器,我只想要字母字符.我在想,如果[A-z]和[a-zA-Z]是相等的或是否存在差异明智的性能.
我继续阅读[a-zA-Z]我的搜索,没有提到[A-z].
我正在使用java的String.matches(regex).
^(?=.*[0-9])(?=.*[A-z])[0-9A-z-]{17}$
Run Code Online (Sandbox Code Playgroud)
应该匹配"17个字母数字字符,也允许使用连字符,必须包含至少一个字母和至少一个数字"
它会正确匹配:
ABCDF31U100027743
Run Code Online (Sandbox Code Playgroud)
并正确拒绝匹配:
AB$DF31U100027743
Run Code Online (Sandbox Code Playgroud)
(以及几乎任何其他非字母数字字符)
但显然会允许:
AB^DF31U100027743
Run Code Online (Sandbox Code Playgroud)