Lucene/Java中\s*、\s+正则不生效,代码空格无法移除求助
问题:Lucene代码分析器中空白字符正则匹配失效的解决办法
我正在使用Java结合Lucene开发代码分析器,希望移除空白字符以实现代码规范化,但发现\s*和\s+正则表达式无法被识别。
原实现代码
Analyzer ana = CustomAnalyzer.builder(Paths.get(".")) .addCharFilter("patternreplace","pattern","[{]|[}]|[;]|[,]|[(]|[)]","replacement","") .withTokenizer(SimplePatternSplitTokenizerFactory.class,"pattern","[\n]") .addTokenFilter(LowerCaseFilterFactory.class) .addTokenFilter("patternreplace","pattern","[jlk][+][+]","replacement","i++") .addTokenFilter("patternreplace","pattern","size","replacement","length") .addTokenFilter("patternreplace","pattern","[\\s*][jkl][\\s*]","replacement"," i ") .addTokenFilter("patternreplace","pattern","[\\s+]","replacement","") .build(); return muestraTexto(ana, texto);
测试用例代码
for(int i = 0; i < nada.size(); i++){ suma = 5 + 3; } for(int j = 0; j < algo.size(); j++){ suma2 = 5+3; }
当前输出结果
forint i = 0 i < nada.length i suma = 5 3 forint j = 0 j < algo.length i suma2 = 53
目前空格并未被成功移除,请求解决该问题。
解决办法
问题核心是正则表达式写法错误:方括号[]是字符类,里面的*和+会被当作普通字符处理,而非量词,导致正则完全达不到预期效果。以下是具体修正方案:
1. 修正空白匹配正则
- 将匹配
jkl前后空白的正则[\\s*][jkl][\\s*]改为\\s*[jkl]\\s*:去掉方括号,让*作为量词匹配零个或多个空白字符。 - 将移除空白的正则
[\\s+]改为\\s+:去掉方括号,让+作为量词匹配一个或多个空白字符,替换为空即可移除所有连续空白。
2. 调整Filter顺序(推荐)
把移除空白的Filter放在最后,确保前面所有替换操作引入的空白都能被统一处理。
修正后的完整代码
Analyzer ana = CustomAnalyzer.builder(Paths.get(".")) .addCharFilter("patternreplace","pattern","[{]|[}]|[;]|[,]|[(]|[)]","replacement","") .withTokenizer(SimplePatternSplitTokenizerFactory.class,"pattern","[\n]") .addTokenFilter(LowerCaseFilterFactory.class) .addTokenFilter("patternreplace","pattern","[jlk][+][+]","replacement","i++") .addTokenFilter("patternreplace","pattern","size","replacement","length") .addTokenFilter("patternreplace","pattern","\\s*[jkl]\\s*","replacement"," i ") .addTokenFilter("patternreplace","pattern","\\s+","replacement","") .build(); return muestraTexto(ana, texto);
修正后预期输出
forinti=0i<nada.lengthi suma=53 forinti=0i<algo.lengthi suma2=53
内容的提问来源于stack exchange,提问作者leyva_7
相关产品推荐
相关产品推荐

