要读取 CSV 文件,我在 Java 中有以下正则表达式:
Pattern csvline = Pattern.compile("((([^\\\"]|\\\"\\\")+|\\\"([^\\\"]|\\\"\\\")+\\\"))*", Pattern.DOTALL);
这个表达式通过了这个在线 Regex 测试。但是,在运行它时它总是抛出一个StackOverflowError
.
经过一番研究,我发现解决方案是将表达式替换为
Pattern csvline = Pattern.compile("((([^\\\"]|\\\"\\\")++|\\\"([^\\\"]|\\\"\\\")++\\\"))*", Pattern.DOTALL);
在这里,我使用所有格量词而不是贪婪的量词。在这种情况下,它也算是一种优化。
我的问题是,是因为 Java 不能处理很多回溯(它会消耗堆栈空间,我相信一个好的引擎不应该这样),所以任何时候当你看到StackOverflowError
由正则表达式引起的,你应该考虑优化减少回溯的方法?