Java正则表达式使用一种模式,而不是两种

时间:2019-06-14 07:04:03

标签: java regex

我有一个包含行的文本文件,其中一些格式如下:

  • 3个标签,
  • 如果最后几个单词和换行符结束后。
  • 我需要逐行抓住这些行中的单词(带有文本中每个单词的索引)。

我想到了一个使用2个正则表达式模式和2个循环的解决方案(添加了下面的代码),但是我想知道是否存在仅使用一个正则表达式模式的更好的解决方案。

以下是文本行的示例:

            Hello I am studying regex!
            This is a line in the text.
                Don't need to add this line
        nor this line.
            But this line should be included.
Map<String, Integer> wordsMap = New HashMap<>();

Pattern p = Pattern.compile("\\t{3}(.*)\\n");
Matcher m = p.matcher(text);

Pattern p2 = Pattern.compile("(\S+)");
Matcher m2 = p.matcher(");

while(m.find()) {
    m2.reset(m.group(1));
    while(m2.find()) {
        wordsMap.add(m2.group(1), m.start(1) + m2.start(1));
    }
}

1 个答案:

答案 0 :(得分:1)

您可以使用

(?:\G(?!^)\h+|^\t{3})(\S+)

请参见regex demo。使用Pattern.MULTILINE标志编译模式。

获取第1组数据。

详细信息

  • (?:\G(?!^)\h+|^\t{3})-上一场比赛的结束但不在一行的开头,其后没有1+个水平空格字符或在一行的开头三个制表符
  • (\S+)-第1组:任意1个以上的非空白字符。

Java demo

String s = "\t\t\tHello I am studying regex!\n\t\t\tThis is a line in the text.\n\t\t\t\tDon't need to add this line\n\t\tnor this line.\n\t\t\tBut this line should be included.";
Pattern pattern = Pattern.compile("(?:\\G(?!^)\\h+|^\t{3})(\\S+)", Pattern.MULTILINE);
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println("Match: '" + matcher.group(1) + "', Start: " + matcher.start(1)); 
} 

输出:

Match: 'Hello', Start: 3
Match: 'I', Start: 9
Match: 'am', Start: 11
Match: 'studying', Start: 14
Match: 'regex!', Start: 23
Match: 'This', Start: 33
Match: 'is', Start: 38
Match: 'a', Start: 41
Match: 'line', Start: 43
Match: 'in', Start: 48
Match: 'the', Start: 51
Match: 'text.', Start: 55
Match: 'But', Start: 113
Match: 'this', Start: 117
Match: 'line', Start: 122
Match: 'should', Start: 127
Match: 'be', Start: 134
Match: 'included.', Start: 137