在测试小字符串(例如 isPhoneNumber 或 isHexadecimal)时,使用正则表达式是否有性能优势,或者强制使用它们会更快吗?仅通过检查给定字符串的字符是否在指定范围内来强制它们不会比使用正则表达式更快吗?
例如:
public static boolean isHexadecimal(String value)
{
if (value.startsWith("-"))
{
value = value.substring(1);
}
value = value.toLowerCase();
if (value.length() <= 2 || !value.startsWith("0x"))
{
return false;
}
for (int i = 2; i < value.length(); i++)
{
char c = value.charAt(i);
if (!(c >= '0' && c <= '9' || c >= 'a' && c <= 'f'))
{
return false;
}
}
return true;
}
对比
Regex.match(/0x[0-9a-f]+/, "0x123fa") // returns true if regex matches whole given expression
似乎有一些与正则表达式相关的开销,即使模式是预编译的,只是因为正则表达式必须在许多一般情况下工作。相比之下,蛮力方法完全符合要求,仅此而已。我是否错过了正则表达式的一些优化?
最佳答案
检查字符串字符是否在特定范围内正是构建正则表达式的目的。它们将表达式转换为一系列原子指令;他们基本上是写出您的手动解析步骤,但处于较低级别。
正则表达式的缓慢之处在于将表达式转换为指令。当一个正则表达式被多次使用时,您可以看到真正的性能提升。那时您可以提前编译表达式,然后简单地在匹配、搜索、替换等中应用生成的编译指令。
与任何与性能有关的情况一样,执行一些测试并测量结果 .
关于正则表达式与小字符串的蛮力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40206388/