如何使用JFlex正则匹配name=或name = 开头的行并提取值
JFlex 行内容提取实现方案
可直接复用以下规则与代码,实现提取行首name=/name = 后内容的需求。
JFlex 规则文件(命名为NameExtractor.jflex)
package com.example; import java.io.*; %% %class NameExtractorLexer %public %function yylex %type Void %line %column %{ // 输出提取结果,可按需替换为写入集合、文件等逻辑 private void outputValue(String val) { System.out.println(val.trim()); } %} // 正则宏定义 LineTerminator = \r|\n|\r\n WhiteSpace = [ \t] NamePrefix = ^"name"{WhiteSpace}*"="{WhiteSpace}* ValueContent = [^\r\n]+ %% <YYINITIAL> { // 匹配目标行,提取等号后内容 {NamePrefix}{ValueContent} { String fullLine = yytext(); int equalPos = fullLine.indexOf('='); String targetValue = fullLine.substring(equalPos + 1); outputValue(targetValue); } // 跳过无关行内容 [^\r\n]+ { } // 处理换行,保证行首匹配逻辑正常生效 {LineTerminator} { } }
配套Java调用代码(命名为Main.java)
package com.example; import java.io.*; public class Main { public static void main(String[] args) { if (args.length != 1) { System.err.println("用法: java com.example.Main <待处理文本文件路径>"); System.exit(1); } try (Reader reader = new FileReader(args[0])) { NameExtractorLexer lexer = new NameExtractorLexer(reader); lexer.yylex(); } catch (IOException e) { e.printStackTrace(); } } }
关键规则说明
- 行首匹配:JFlex中
^元字符默认匹配行起始位置,可确保仅捕获行首的name赋值语句,不会误匹配行中间出现的name=片段 - 格式兼容:
{WhiteSpace}*匹配0到多个空格、制表符,同时兼容name=xxx、name = xxx、name = xxx等多种带不同数量空格的写法 - 内容提取:匹配到目标行后,通过定位等号位置截取后半段内容,自动去除首尾空白后输出,避免值前后多余空格影响结果,也可兼容值本身包含等号的场景
效果验证
使用提供的测试输入:
bla bla bla bla bla bla name=StackOverFlow name = ThisIsGo bla bla bla
运行后输出结果为:
StackOverFlow ThisIsGo
内容的提问来源于stack exchange,提问作者Mobinkh
相关产品推荐
相关产品推荐

