正则表达式与小字符串的蛮力

标签 regex string performance brute-force

在测试小字符串(例如 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/

相关文章:

java - 一种以恒定速度沿直线移动鸵鸟的有效算法

Java replaceAll() & split() 违规行为

regex - 我怎样才能让它只匹配单词 'speaks' 之后的单词并忽略逗号和空格

regex - Grep中有真正通用的通配符吗? [复制]

javascript - 我可以从 document.formID.submit(); 调用 JS 函数吗?

python - 删除列表中包含的 numpy 行?

java - 检查所有订单的运行时间是多少?

javascript - 使正则表达式变得更好

php - 从字符串中获取字符串后面的字符串

c - 在 C 中 - 检查字符数组中是否存在字符