我有一个包含行的文本文件,其中一些格式如下:
我想到了一个使用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));
}
}
答案 0 :(得分:1)
您可以使用
(?:\G(?!^)\h+|^\t{3})(\S+)
请参见regex demo。使用Pattern.MULTILINE
标志编译模式。
获取第1组数据。
详细信息
(?:\G(?!^)\h+|^\t{3})
-上一场比赛的结束但不在一行的开头,其后没有1+个水平空格字符或在一行的开头三个制表符(\S+)
-第1组:任意1个以上的非空白字符。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