Java正则匹配含换行的#开头信息块并存入数组问题咨询
问题原因
你当前使用的正则#(.*)配合Pattern.MULTILINE模式时,默认.不匹配换行符,因此只会捕获#开头的单行内容,无法拿到后续的年龄、技能行。
解决方案
方案1:使用排除字符集(最简单,无需额外模式)
直接用[^#]匹配所有非#的字符(天然包含换行符),正则写为#[^#]+,示例代码如下:
String regex = "#[^#]+"; List<String> matches = Pattern.compile(regex) .matcher(raw) .results() .map(MatchResult::group) .map(String::trim) // 可选:去除每个块末尾的多余空行 .collect(Collectors.toList());
方案2:开启DOTALL模式配合预查
如果需要更精准的边界控制,可以开启Pattern.DOTALL让.支持匹配换行符,配合正向预查匹配到下一个块开头或文本结束为止:
// \R 匹配任意类型的换行符,\Z 匹配整个文本的结束位置 String regex = "#.*?(?=\\R#|\\Z)"; List<String> matches = Pattern.compile(regex, Pattern.DOTALL) .matcher(raw) .results() .map(MatchResult::group) .map(String::trim) .collect(Collectors.toList());
输出结果
两种方案最终得到的matches列表都包含3个元素,每个元素对应完整的人员信息块,示例:
#John age: 25 skill: boxer
内容的提问来源于stack exchange,提问作者Joona Ritva
相关产品推荐
相关产品推荐

