Java - 抓取两个字符串之间所有字符串的最佳方法?(regex?)

问题描述 投票:35回答:4

这个问题已经困扰我很久了,但从本质上讲,我正在寻找一种最有效的方法来抓取两个Strings之间的所有Strings。

我已经做了很多个月的方法是通过使用一堆临时索引、字符串、子串,真的很乱。(为什么Java没有一个原生的方法,如 String substring(String start, String end)?

说我有一个字符串。

abcabc [pattern1]foo[pattern2] abcdefg [pattern1]bar[pattern2] morestuff

最终目标是输出 foobar. (以后还要加到一个JList中)

我一直在尝试将 regex 纳入到 .split() 但一直没有成功。我试过用 *的和 .但我认为这不是我的本意,特别是由于... .split() 只需要一个参数就可以拆分反对。

否则我觉得还有一种方法就是使用Pattern和Matcher类?但是我真的很模糊,不知道合适的程序。

java regex string
4个回答
82
投票

你可以构造一个regex来为你做这件事。

// pattern1 and pattern2 are String objects
String regexString = Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2);

这将处理 pattern1pattern2 作为 字面 文本,而图案之间的文本则被捕捉到,在第一个 捕捉群体. 您可以删除 Pattern.quote() 如果你想使用regex,但我...。不要 保证任何事情,如果你这样做。

你可以通过向 regexString.

  • 如果你想进行Unicode识别的大小写敏感匹配,则添加 (?iu) 一开始 regexString或供应 Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE 旗帜鲜明 Pattern.compile 方法。
  • 如果你想捕捉内容,即使两个分隔符跨行出现,也可以添加 (?s) 之前 (.*?)"(?s)(.*?)"或供应 Pattern.DOTALL 旗帜鲜明 Pattern.compile 方法。

然后编译regex,获得一个 Matcher 对象,遍历这些匹配的对象,并将它们保存到一个名为 List (或任何 Collection,由您决定)。)

Pattern pattern = Pattern.compile(regexString);
// text contains the full text that you want to extract data
Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
  String textInBetween = matcher.group(1); // Since (.*?) is capturing group 1
  // You can insert match into a List/Collection here
}

测试代码。

String pattern1 = "hgb";
String pattern2 = "|";
String text = "sdfjsdkhfkjsdf hgb sdjfkhsdkfsdf |sdfjksdhfjksd sdf sdkjfhsdkf | sdkjfh hgb sdkjfdshfks|";

Pattern p = Pattern.compile(Pattern.quote(pattern1) + "(.*?)" + Pattern.quote(pattern2));
Matcher m = p.matcher(text);
while (m.find()) {
  System.out.println(m.group(1));
}

请注意,如果你搜索的文本之间的 foobar 在此输入 foo text foo text bar text bar 用上面的方法,你会得到一个匹配,那就是  text foo text .


10
投票

这里有一句话,可以说是一语道破天机。

List<String> strings = Arrays.asList( input.replaceAll("^.*?pattern1", "")
    .split("pattern2.*?(pattern1|$)"));

具体操作是:

  1. 删掉pattern1之前的所有内容 (为了避免第一项是空字符串)
  2. 在输入上进行分割(非贪婪的 .*?)之间
  3. 使用实用方法 Arrays.asList() 以产生 List<String>

下面是一些测试代码。

public static void main( String[] args ) {
    String input = "abcabc pattern1foopattern2 abcdefg pattern1barpattern2 morestuff";
    List<String> strings = Arrays.asList( input.replaceAll("^.*?pattern1", "").split("pattern2.*?(pattern1|$)"));
    System.out.println( strings);
}

输出:

[foo, bar]

9
投票

试试这个

String str = "its a string with pattern1 aleatory pattern2 things between pattern1 and pattern2 and sometimes pattern1 pattern2 nothing";
Matcher m = Pattern.compile(
                            Pattern.quote("pattern1")
                            + "(.*?)"
                            + Pattern.quote("pattern2")
                   ).matcher(str);
while(m.find()){
    String match = m.group(1);
    System.out.println(">"+match+"<");
    //here you insert 'match' into the list
}

它打印出来了

> aleatory <
> and <
> <
© www.soinside.com 2019 - 2024. All rights reserved.