【问题标题】:using Regex pattern match for pipe delimited string对管道分隔字符串使用正则表达式模式匹配
【发布时间】:2021-08-09 06:40:48
【问题描述】:

我正在尝试对 java 中的管道分隔字符串进行模式匹配。但不确定出了什么问题。需要专家的帮助。

A|Bill Access Key|CBEBALCOM|
D|215325775|20210507|9|BALCOM SYSTEMS LTD|||
I|1|Back of Duplex Page|

我有上述记录的文件,我想查找以“D”开头的记录并获取下一个管道分隔值。并将它们存储在一些 POJO 对象中。

因此尝试通过应用模式首先读取值但无法找到匹配项。

String pattern = "r'D((?:\"(.*?)\"))'";

Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(line); 
if (m.find( )) { 
    System.out.println("value1" + m.group(0) ); 
    System.out.println("value2" + m.group(1) ); 
} else {
    System.out.println("No Match"); 
} 

【问题讨论】:

  • 您期望的 exact 输出是什么?
  • 首先,从正则表达式中删除 r'',因为它们不是正则表达式的一部分。它们是其他语言用来分隔正则表达式的字符。在 Java 中,正则表达式是字符串文字。 --- 其次,由于您的数据没有双引号,请从正则表达式中删除 "。 --- 第三,问题都与| 分隔符有关,但正则表达式根本不检查|。那将如何运作? --- 简而言之,您的正则表达式与您声称想要的东西相去甚远。退后一步,重新思考你在做什么。
  • 请查看regex101.com。在那里您可以验证正则表达式模式。

标签: java regex matcher


【解决方案1】:

您可以这样尝试,而不是使用纯正则表达式解决方案

  • 流式传输文件的行
  • 过滤以D| 开头的行
  • 从索引 2 开始拆分过滤行
  • 创建仅包含前两个值的新数组
  • 并收集到List<String[]>
List<String[]> list = Files.lines(Path.of("Myfile.txt"))
.filter(str->str.startsWith("D|"))
.map(str->str.substring(2).split("\\|",3))
.map(arr->new String[]{arr[0],arr[1]})
.collect(Collectors.toList());

} catch (IOException ioe) {
    ioe.printStackTrace();
}

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多