最近上一个项目,对效率要求比较高,字符匹配是正则表达式快还是IndexOf快呢?

时间:2021-11-08 06:14:14
主要是网页内容提取。
有网友说正则快: http://topic.csdn.net/t/20040726/15/3211176.html

15 个解决方案

#1


正则吧~

#2


个人觉得是正则。

你测试几把就晓得了

#3


有人用java测试过,正则效率低: http://blog.sina.com.cn/s/blog_49237ee3010008ig.html

#4


上面的文章倒是不错~

#5


没有测试过,不过你可以参考下这篇文章,. net 你怎么判断字符串是否全是数字

正如这位LZ所述,

引用 0 楼 0 的回复:
结果:循环判断是否是数字字符效率是最高的

而vbscript的方法效率比较低了

顺便测试了下vbscript里的 left和right方法效率也一样的低,还不及substring的十分之一

所以vbscript里虽然有几个方法从名字看来比较好用,实际却比较杯具。

#6


客客 在其53楼写道:

正则适用于带格式,并且不是很频繁的调用中,如果判断是否全是数字,那正则绝不是首选

#7


自己写程序代码完美,那就用indexof快
否则正则快。

#8


嗯,支持LZ使用IndexOf。

#9


感觉正则快吧?直觉没测试

#10


单一的indexof肯定要比正则快
但实际应用中并不是单一对比的
正则可以完成很复杂的数据匹配
如果10个indexof才能完成的功能1个正则就搞定,你还会选择用indexof吗
你能保证10个indexof的速度比一个正则的速度快吗

#11


正则是最慢的

#12


引用 3 楼 114 的回复:
有人用java测试过,正则效率低:http://blog.sina.com.cn/s/blog_49237ee3010008ig.html


正则使可以编译的,但是并不需要每次调用都编译一下
,而是在类初始化时候编译或者放一个静态表达式,静态初始化时候编译。
调用一次匹配的速度肯定赶不上indexOf,因为它需要编译一次,但是循环多次时间是差不多的,因为对于几秒几十秒而言编译一次时间可以忽略了。

#13


最好的就是自己写出来比对一下

#14



static void Main() {
string content = @"fpwuepqwurpqwu""13123183""fweifpwufpwoeufpqwupr""fweifwpouquefpoqf""""     ";
Regex ex = new Regex(@"""([^""]+)""", RegexOptions.Compiled);

List<string> lst = null;
int tick = 0;

lst = new List<string>(0x10000);
tick = Environment.TickCount;
for (int i = 0; i < 1000000; i++) {
int tagE = 0;
int p = 0;
while (p < content.Length) {
p = content.IndexOf('\"', p);
if (p == -1) break;
tagE = content.IndexOf('\"', p + 1);
if (tagE == -1) break;
lst.Add(content.Substring(p + 1, tagE - p - 1));
p = tagE + 1;
}
}
Debug.Print((Environment.TickCount - tick).ToString() + "," + lst.Count);

lst = new List<string>(0x10000);
tick = Environment.TickCount;
for (int i = 0; i < 1000000; i++) {
int tagE = 0;
int p = 0;
while (p < content.Length) {
p = content.IndexOf("\"", p);
if (p == -1) break;
tagE = content.IndexOf("\"", p + 1);
if (tagE == -1) break;
lst.Add(content.Substring(p + 1, tagE - p - 1));
p = tagE + 1;
}
}
Debug.Print((Environment.TickCount - tick).ToString() + "," + lst.Count);

lst = new List<string>(0x10000);
tick = Environment.TickCount;
for (int i = 0; i < 1000000; i++) {
foreach (Match m in ex.Matches(content)) {
lst.Add(m.Groups[1].Value);
}
}
Debug.Print((Environment.TickCount - tick).ToString() + "," + lst.Count);


}


测试结果:
735,2000000
6500,2000000
3328,2000000

因此,indexOf写得好,可以快于正则,否则正则更快。如果计算复杂,还是用正则比较好。
1和2代码一样,区别就是第一个IndexOf(char, startindex), 而第二个是string, startindex

#15


简单的匹配当然indexOf快过正则表达式,但正则表达式可作复杂条件的匹配,在这种情况下,一次正则匹配可能需要调用多次indexOf才能完成,indexOf在性能上就无优势可言,甚至可能还要慢些,而且还要增加编码的工作量。

#1


正则吧~

#2


个人觉得是正则。

你测试几把就晓得了

#3


有人用java测试过,正则效率低: http://blog.sina.com.cn/s/blog_49237ee3010008ig.html

#4


上面的文章倒是不错~

#5


没有测试过,不过你可以参考下这篇文章,. net 你怎么判断字符串是否全是数字

正如这位LZ所述,

引用 0 楼 0 的回复:
结果:循环判断是否是数字字符效率是最高的

而vbscript的方法效率比较低了

顺便测试了下vbscript里的 left和right方法效率也一样的低,还不及substring的十分之一

所以vbscript里虽然有几个方法从名字看来比较好用,实际却比较杯具。

#6


客客 在其53楼写道:

正则适用于带格式,并且不是很频繁的调用中,如果判断是否全是数字,那正则绝不是首选

#7


自己写程序代码完美,那就用indexof快
否则正则快。

#8


嗯,支持LZ使用IndexOf。

#9


感觉正则快吧?直觉没测试

#10


单一的indexof肯定要比正则快
但实际应用中并不是单一对比的
正则可以完成很复杂的数据匹配
如果10个indexof才能完成的功能1个正则就搞定,你还会选择用indexof吗
你能保证10个indexof的速度比一个正则的速度快吗

#11


正则是最慢的

#12


引用 3 楼 114 的回复:
有人用java测试过,正则效率低:http://blog.sina.com.cn/s/blog_49237ee3010008ig.html


正则使可以编译的,但是并不需要每次调用都编译一下
,而是在类初始化时候编译或者放一个静态表达式,静态初始化时候编译。
调用一次匹配的速度肯定赶不上indexOf,因为它需要编译一次,但是循环多次时间是差不多的,因为对于几秒几十秒而言编译一次时间可以忽略了。

#13


最好的就是自己写出来比对一下

#14



static void Main() {
string content = @"fpwuepqwurpqwu""13123183""fweifpwufpwoeufpqwupr""fweifwpouquefpoqf""""     ";
Regex ex = new Regex(@"""([^""]+)""", RegexOptions.Compiled);

List<string> lst = null;
int tick = 0;

lst = new List<string>(0x10000);
tick = Environment.TickCount;
for (int i = 0; i < 1000000; i++) {
int tagE = 0;
int p = 0;
while (p < content.Length) {
p = content.IndexOf('\"', p);
if (p == -1) break;
tagE = content.IndexOf('\"', p + 1);
if (tagE == -1) break;
lst.Add(content.Substring(p + 1, tagE - p - 1));
p = tagE + 1;
}
}
Debug.Print((Environment.TickCount - tick).ToString() + "," + lst.Count);

lst = new List<string>(0x10000);
tick = Environment.TickCount;
for (int i = 0; i < 1000000; i++) {
int tagE = 0;
int p = 0;
while (p < content.Length) {
p = content.IndexOf("\"", p);
if (p == -1) break;
tagE = content.IndexOf("\"", p + 1);
if (tagE == -1) break;
lst.Add(content.Substring(p + 1, tagE - p - 1));
p = tagE + 1;
}
}
Debug.Print((Environment.TickCount - tick).ToString() + "," + lst.Count);

lst = new List<string>(0x10000);
tick = Environment.TickCount;
for (int i = 0; i < 1000000; i++) {
foreach (Match m in ex.Matches(content)) {
lst.Add(m.Groups[1].Value);
}
}
Debug.Print((Environment.TickCount - tick).ToString() + "," + lst.Count);


}


测试结果:
735,2000000
6500,2000000
3328,2000000

因此,indexOf写得好,可以快于正则,否则正则更快。如果计算复杂,还是用正则比较好。
1和2代码一样,区别就是第一个IndexOf(char, startindex), 而第二个是string, startindex

#15


简单的匹配当然indexOf快过正则表达式,但正则表达式可作复杂条件的匹配,在这种情况下,一次正则匹配可能需要调用多次indexOf才能完成,indexOf在性能上就无优势可言,甚至可能还要慢些,而且还要增加编码的工作量。