java - 使用替代与单个正则表达式时的正则表达式效率

标签 java regex

我正在编写一个 CSV 解析器,为了检测我期望在文件中获取的不同数据类型,我为每种数据类型都有一个映射,每个映射都包含我定义为有效且可识别的正则表达式。例如,对于我的整数值,这是我的 map :

Map<String, String> integerFormatRegexps = new HashMap<String, String>();
integerFormatRegexps.put("^[1-9]\\d{1,9}$", "##0");
integerFormatRegexps.put("^-[1-9]\\d{1,9}$", "-##0");
integerFormatRegexps.put("^0$", "0");

现在,我已经看到了几个examples在 SO 中,他们不是将这些正则表达式分开,而是使用替代,而不是三个正则表达式,我可以只使用一个:

Map<String, String> integerFormatRegexps = new HashMap<String, String>();
integerFormatRegexps.put("^[1-9]\\d{1,9}$|^-[1-9]\\d{1,9}$|^0$", "Integer");

我的问题是,在 Java 中匹配模式时,这两种方法中哪一种通常更有效?迭代单独的更简单的正则表达式来查找匹配项,或者仅匹配一个更复杂的正则表达式?

最佳答案

首先,我不得不说,效率不太可能成为您的问题。您的正则表达式相对简单,并且您似乎在提取它们后使用它们来单独匹配值。

也就是说,在交替时需要注意的是不同的分支可以匹配相同的字符。最好的例子是 (.|\s) ,有时由还不了解 DOTALL/Singleline 模式的正则表达式初学者使用(或 [\S\s] ,如 this question )。将其放在一个良性的正则表达式中间,用它来搜索不是特别大的文本,然后看着你的计算机陷入紧张状态。

不过,您的示例正则表达式很好,因为每个分支都必须以不同的内容开头( [1-9]-0 )。但正如我所说,我认为正则表达式的效率永远不会成为问题。做你认为更方便的事情;更紧凑的代码和更少数量的正则表达式对于更大、更难维护的正则表达式来说是合理的权衡吗?

还有一件事:如果您在紧密循环中重复使用正则表达式,请务必使用缓存的 Pattern 对象;编译它们的成本是巨大的。事实上,考虑将它们作为模式而不是字符串存储在映射中。例如:

Pattern integerRegex = Pattern.compiile("^[1-9]\\d{1,9}$|^-[1-9]\\d{1,9}$|^0$");

Map<String, String> integerFormatRegexps = new HashMap<String, String>();
integerFormatRegexps.put(integerRegex, "Integer");

然后你可以使用静态Pattern.matches()执行检查的方法。

关于java - 使用替代与单个正则表达式时的正则表达式效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36901926/

相关文章:

java - Netbeans 中相同 swing 代码的异常行为

java - 为此我需要单个循环还是嵌套循环?

python重新匹配不以word结尾的字符串

regex - sed 替换双引号内的内容

php - 浏览器版本匹配 - PHP 5.1.6 中的正则表达式中断

javascript - 拆分数字和 alpha

java.io.FileNotFoundException : (Access is denied) when i have permission to the file

java - 客户数量四舍五入

java - eclipse jdt 编译器中不必要的强制转换警告

C# 正则表达式 : negative lookahead fails with the single line option