gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:59:42 25 4
gpt4 key购买 nike

我正在编写一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com