正则表达式以匹配多行中的字符串模式

时间:2019-06-17 22:04:53

标签: java regex

我正在尝试从pdf中提取文本。但是提取的文本不正确。因此,我正在编写正则表达式以提取和使用它。由于我刚开始编写正则表达式并处理文本中的多行,因此我遇到了问题。可以帮个忙。 字符串文本是这样的: stringtext = 0,10-0,20 0,30-0,40,0,50-0,60(第1行) A(第2行) /(第3行) B(第4行) /(第5行) C(第6行) /(第7行) D(第8行) /(第9行)

我的目标是从字符串文本中仅提取A B C D。可以帮个忙。谢谢!

我尝试进行研究,但找不到适合我的解决方案。

    stringtext = 0,10 - 0,20 0,30 - 0,40, 0,50 - 0,60
                 A
                 /
                 B
                 /
                 C
                 /
                 D
                 /;
   Pattern pattern = pattern.compile(".*\\r\\n(\\_.*)$");
   Matcher matcher = pattern.matcher(stringtext);
   if(matcher.find()){
    System.out.println(matcher.group(1);
   }

预期输出应为A B C D

1 个答案:

答案 0 :(得分:0)

如果您想使用.*来匹配第一行,则可以通过以第一个数字的模式开头来使匹配更加具体。

您可以利用\G锚获得重复的匹配并匹配捕获组中的大写字符。

(?:^\d+,\d+.*|\G(?!^))\R\h+([A-Z])\R.*\/

说明

  • (?:非捕获组
    • ^\d+,\d+.*从字符串1+个数字,逗号和1+个数字的开头开始匹配
    • |
    • \G(?!^)在上一场比赛的末尾而不是在开始时断言
  • )关闭非捕获组
  • \R\h+匹配unicode换行符序列和1+个水平空格字符
  • ([A-Z])在组1中捕获大写字符
  • \R.*\/匹配unicode换行符序列,除换行符0+次和正斜杠以外的任何字符。

Regex demo | Java demo

例如:

String regex = "(?:^\\d+,\\d+.*|\\G(?!^))\\R\\h+([A-Z])\\R.*\\/";
String stringtext = "0,10 - 0,20 0,30 - 0,40, 0,50 - 0,60\n"
     + "                     A\n"
     + "                     /\n"
     + "                     B\n"
     + "                     /\n"
     + "                     C\n"
     + "                     /\n"
     + "                     D\n"
     + "                     /;";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(stringtext);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}

结果

A
B
C
D