当前位置: 首页 > 知识库问答 >
问题:

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

方季同
2023-03-14

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

  • 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个答案

谷越
2023-03-14

你可以用

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

请看regex演示。使用模式编译模式。多行标志。

获取组1数据

细节

  • (?:\G(?)\h | ^\t{3})-上一个匹配的结尾,但不是在一行的开头,后跟一个水平空白字符,或者在一行的开头有三个制表符
  • (\S)-第1组:任意1个非空白字符

Java演示:

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
 类似资料:
  • 问题内容: 我需要这件事的帮助。查看以下正则表达式: 我想查找这样的词:“自制”,“ aaaa-bbb”而不是“ aaa-bbb”,而 不是 “ aaa–aa–aaa”。基本上,我想要以下内容: 单词-连字符-单词。 它适用于所有内容,但该模式会通过:“ aaa–aaa–aaa”,但不应通过。哪种正则表达式适用于此模式? 问题答案: 可以从表达式中删除反斜杠: 下面的代码应该工作 请注意,您可以使

  • 我有一个模式,我想从字符串链接捕获这个: 我想捕获文本的地方,。由于我所要做的就是 ** 和 ,我尝试了一个正则表达式,但它从第一个 一直返回匹配项,而不是在我的模式之前返回匹配项请参阅下面的正则表达式 101: https://regex101.com/r/kUBxQf/1

  • 本文向大家介绍Java正则表达式使用,包括了Java正则表达式使用的使用技巧和注意事项,需要的朋友参考一下 一:抓取网页中的Email地址 利用正则表达式匹配网页中的文本 将网页内容分割提取 打印结果: 867124664@qq.com 260678675@QQ.com 806208721@qq.com hr_1985@163.com 32575987@qq.com qingchen0501@12

  • 我有3个正则表达式,但当模式匹配时执行相同的操作,所以我考虑将所有三个表达式合并为一个。我尝试了很多,但无法让“|”I.e”或“在我的正则表达式中工作 regex1:<代码>文本。替换(/([\u00A9-\u3299])/g,函数myFunction(x){…} regex2: regex3: 我试过这样做,但它不起作用regex:

  • 问题内容: 我有一个有效的正则表达式: 我也有一个正则表达式: 但是我不知道如何将两者结合起来 我试过了,但实际上没有用… 如果重要的话,这就是Java正则表达式中的全部内容。 问题答案: 如果您想要匹配以或开头的序列的正则表达式,请尝试以下操作: 但是除了周围的两个空格字符外,您的正则表达式也应该与之匹配: 这两个正则表达式匹配同一组字符串。

  • 我需要编写一个具有以下规则的正则表达式: null null 这些示例无效: > 12--11(因为它包含两个连字符) 1-2345(因为它包含5号) <>是字符出现在最后一个位置,那么在字符之前必须有一个数字not hypen。 即11-A(必须不及格)11-1A(必须及格)