格式化字符串属性及Java正则Pattern相关技术问询
关于格式化字符串与Java正则过滤代码的疑问解答
一、格式化后的字符串属性问题
- 格式化后的字符串仍然是字符串类型,和普通字符串本质无区别,只是内容符合特定格式规则(比如Markdown、正则表达式规则)。
- 它完全可以正常打印,输出就是带格式标记的文本;只有当对应的解析器(如Markdown渲染器、正则引擎)读取它时,才会将其作为规则执行解析或匹配操作。
二、Java代码相关疑问解答
先贴出原代码:
import java.util.Arrays; import java.util.stream.Collectors; public class StripComments { public static String stripComments(String text, String[] commentSymbols) { String pattern = String.format( "[ ]*([%s].*)?$", Arrays.stream( commentSymbols ).collect( Collectors.joining() ) ); return Arrays.stream( text.split( "\\n" ) ) .map( x -> x.replaceAll( pattern, "" ) ) .collect( Collectors.joining( "\\n" ) ); } }
1. pattern的作用
是的,这个pattern就是用来匹配commentSymbols中任意符号及其之后的所有内容,同时还会匹配符号前可能存在的任意数量空格。
2. pattern的打印输出
当输入为("apples, pears # and bananas\\ngrapes\\nbananas !apples", new String[]{"#", "!"})时,打印pattern会输出:[ ]*([#!].*)?$。如果传入其他注释符号(比如{"//", "/*"}),打印出的pattern会变成[ ]*([///*].*)?$(注:正则中部分特殊符号需要转义,但原例子里的#、!属于无需额外转义的元字符)。
3. 可打印字符串为何能过滤内容
因为replaceAll方法接收的第一个参数是正则表达式字符串——Java的正则引擎会把这个普通字符串当成正则规则解析,识别其中的特殊语法(比如[]表示字符集、*表示任意次数、$表示行尾等),从而实现匹配和替换。也就是说,它本身是可打印的普通字符串,但内容符合正则语法规则,所以能被正则引擎解读为匹配规则。
4. [ ]*([#!].*)?$的含义
拆解这个正则的各个部分:
[ ]*:匹配0个或多个空格([#!].*)?:可选分组,[#!]匹配#或!任意一个符号,.*匹配该符号之后的所有字符(直到行尾),?表示这个分组可以出现0次或1次$:匹配行的结尾
整体意思是:匹配行尾处,0个或多个空格加上(#/!符号及其后所有内容)的组合,这个组合可以不存在,但若存在就会被匹配。
5. 直接初始化字符串是否有效
是的,在输入参数为{"#", "!"}的情况下,直接初始化字符串为"[ ]*([#!].*)?$",和原代码通过String.format生成的pattern效果完全一致。但原代码写法更灵活——换其他注释符号时,只需传入不同的commentSymbols数组就能生成对应正则规则,而写死字符串的话只能处理#和!这两种符号。
内容的提问来源于stack exchange,提问作者RockBottom1114
相关产品推荐
相关产品推荐

