【问题标题】:Extract all substrings beginning and ending with a regex from large string从大字符串中提取所有以正则表达式开头和结尾的子字符串
【发布时间】:2017-01-11 14:57:46
【问题描述】:

我有一个大字符串,其中包含两个常量标记字符串之间的多行子字符串,我可以用正则表达式识别它。

为了简单起见,我在这里将它们命名为 abcdeffedcba

abcdef Sed lobortis nisl sed malesuada bibendum. fedcba
...

abcdef Fusce odio turpis, accumsan non posuere placerat. 
1
2
3
fedcba

abcdef Aliquam erat volutpat. Proin ultrices fedcba

如何从大字符串中获取所有出现的包括标记?

【问题讨论】:

  • abcdef[\s\S]*?fedcba

标签: java regex


【解决方案1】:

类似

Pattern r = Pattern.compile("abcdef[\\s\\S]*?fedcba");
Matcher m = r.matcher(sInput);
if (m.find( )) {
    System.out.println("Found value: " + m.group() );
}

sInput 是您要搜索的字符串。

[\s\S]*? 将匹配任意数量的任意字符,直到以下 fedcba。感谢?,这是一个非贪婪匹配,这意味着它不会持续到最后一个fedcba(就像它是贪婪的一样),从而为您提供单独的字符串。

【讨论】:

  • 这是一个好的开始,但似乎只找到第一个匹配项(行)。
  • 我真的不会 java(只是一个 googler ;),但我认为你可以简单地将 if (m.find( )) { 替换为 while (m.find()) {。检查这个答案:stackoverflow.com/a/16817458/2064981
  • 还有一个我忘了提的规范。 abcdef 始终必须是行首。我怎样才能将它添加到模式中?
  • 我找到了,像这样:(?m)^ Check stackoverflow.com/questions/6143304/…
【解决方案2】:

正则表达式:

(?:\babcdef)(?:.*\n)*(?:\bfedcba)

JAVA:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "(?:\\babcdef)(?:.*\\n)*(?:\\bfedcba)";
final String string = "patata\n"
     + "abcdef\n"
     + "Aliquam erat volutpat. Proin ultrices\n"
     + "Testing\n\n"
     + "test[](test)\n"
     + "Testing\n"
     + "fedcba\n"
     + "Testing\n\n\n\n";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

原文:

patata
abcdef
Aliquam erat volutpat. Proin ultrices
Testing

test[](test)
Testing
fedcba
Testing

结果:

abcdef
Aliquam erat volutpat. Proin ultrices
Testing

test[](test)
Testing
fedcba

见:https://regex101.com/r/xXaLgN/5

享受。

不要忘记,如果我帮助你,请将我标记为问题的答案。

【讨论】:

    猜你喜欢
    • 2013-08-04
    • 2022-08-03
    • 2016-12-07
    • 2017-09-17
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多