如何用正则表达式匹配移除字符串首尾各两行内容?
使用正则表达式移除字符串首尾各两行
当然可以用正则表达式来实现这个需求!相比你之前用substring硬编码字符位置的方式,正则的解法更灵活健壮——不用关心首尾两行具体有多少字符,只要结构是首尾各两行,就能准确移除它们。
具体实现代码
直接用String.replaceAll()方法配合正则表达式即可,修改你的代码如下:
public class FakeClass { public void fakeMethod() { String sampleCode = String.format( createLines(7), "public class FakeClass {\n", " public void fakeMethod() {\n", " int a = 5;\n", " int b = 6;\n", " a = b;\n", " }\n", "}\n"); // 用正则替换移除首尾各两行 String result = sampleCode.replaceAll("^.*\\n.*\\n|\\n.*\\n.*$", ""); // 验证结果是否符合预期 assert result.equals(String.format(createLines(3), " int a = 5;\n", " int b = 6;\n", " a = b;\n")); } private static String createLines(int numLines) { return new String(new char[numLines]).replace("\0", "%s"); } }
正则表达式解释
这里用到的正则是^.*\\n.*\\n|\\n.*\\n.*$,拆解来看:
^.*\\n.*\\n:匹配字符串开头的两行内容。^表示字符串起始位置,.*匹配任意数量的非换行字符,\\n匹配换行符——这部分会精准覆盖第一行和第二行(包括它们末尾的换行)。|:逻辑“或”,用来分隔两种匹配规则。\\n.*\\n.*$:匹配字符串结尾的两行内容。$表示字符串结束位置,这部分会覆盖倒数第二行的换行、倒数第二行内容,以及最后一行的内容。
兼容不同换行格式(可选)
如果你的字符串可能包含Windows风格的\r\n换行符,可以把正则改成兼容版本,适配Unix和Windows的换行:
String result = sampleCode.replaceAll("^.*\\r?\\n.*\\r?\\n|\\r?\\n.*\\r?\\n.*$", "");
这里的\\r?\\n表示匹配可选的回车符加换行符,不管是\n还是\r\n都能正确识别。
和substring的对比
你之前的substring(53, sampleCode.length() -5)写法依赖固定的字符偏移量,一旦首尾两行的内容长度发生变化(比如修改类名、方法名),就需要重新计算偏移值;而正则的写法完全不依赖具体字符长度,只要字符串结构是首尾各两行,就能稳定工作,维护性更强。
内容的提问来源于stack exchange,提问作者icelemon
相关产品推荐
相关产品推荐

