Java正则表达式求助:提取"+"到行尾的文本内容
搞定Git Diff新增行提取的问题
我看你现在是想从Git Diff里揪出所有以+开头的行,提取+后面的内容,但之前的代码没成功,问题主要出在正则和字节流处理上,我帮你一步步修正:
先说说之前代码的问题
- 正则写窄了:你用的
(\\+)(.*)(,)要求行必须以逗号结尾,但很多新增行(比如+ context: projectRoot、+ output: {)根本没有逗号,自然匹配不到。 - 没锚定行开头:正则没加
^,可能会误匹配行中间的+,比如字符串里的加号,而不是行首的新增标记。 - 字节流没重置:每次循环处理
DiffEntry时,baos会累加之前的内容,导致后面的匹配混进了旧的diff数据。
修正后的完整代码
String codeDiff = ""; ByteArrayOutputStream baos = new ByteArrayOutputStream(); DiffFormatter df = new DiffFormatter(baos); df.setRepository(git.getRepository()); List<String> diffCodes = new ArrayList<>(); List<String> packageChangesArray = new ArrayList<>(); // 关键:调整后的正则,匹配行首的+,并捕获后面的内容 Pattern p = Pattern.compile("^\\s*\\+(.*)$", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); for (DiffEntry entry : diffs) { baos.reset(); // 每次处理新条目时清空字节流,避免累加 df.format(df.toFileHeader(entry)); codeDiff = new String(baos.toByteArray()); diffCodes.add(codeDiff); Matcher m = p.matcher(codeDiff); while (m.find()) { // 获取+后面的内容,trim可以去掉前后多余空白,不需要的话删掉就行 String extractedContent = m.group(1).trim(); System.out.println("提取到的新增行内容:" + extractedContent); packageChangesArray.add(extractedContent); } }
代码细节说明
- 正则
^\\s*\\+(.*)$:^:锚定到行开头,确保只匹配行首的+,不会误抓行中间的加号\\s*:兼容有些diff格式里+前面可能带的空白(比如缩进后的新增行)\\+:匹配加号本身(.*):捕获加号后面的所有内容直到行尾
baos.reset():每次处理新的DiffEntry时清空字节流,保证每次匹配的都是当前条目的diff内容,不会串味。trim():可选操作,如果想保留原行的缩进空白,直接去掉trim()就行。
测试你的示例内容
用你给的示例diff测试,这个代码会提取到这些内容:
context: projectRoot,entry: path.resolve(projectRoot, 'src/scripts/Index'),resolve: {extensions: ['', '.js', '.jsx'],}; module: {loaders: [{test: /\.jsx?$/,exclude: /node_modules/,loader: 'babel?presets[]=stage-0,presets[]=react,presets[]=es2015', },output: {path: config.build.assetsRoot,publicPath: deploymentBuild ? config.build.assetsPublicPath : config.dev.assetsPublicPath,filename: '[name].js',},
完全符合你要提取所有以+开头行的+到行尾文本的需求~
内容的提问来源于stack exchange,提问作者Ashen
相关产品推荐
相关产品推荐

