Java - 在两个字符串之间获取所有字符串的最佳方法? (正则表达式?)

时间:2012-06-29 02:33:23

标签: java regex string

这个问题一直困扰着我很长一段时间,但基本上我正在寻找最有效的方法来获取两个字符串之间的所有字符串。

我现在已经使用了很多个月的方法是使用一堆临时索引,字符串,子串,而且它真的很乱。 (为什么Java没有String substring(String start, String end)等本机方法?

说我有一个字符串:

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

最终目标是输出foobar。 (后来被添加到JList中)

我一直试图在.split()中加入正则表达式,但还没有成功。我已尝试使用*.的语法,但我不认为这是我的意图,特别是因为.split()只需要一个参数来分割。

否则我认为另一种方法是使用Pattern和Matcher类?但是我对相应的程序非常模糊。

3 个答案:

答案 0 :(得分:76)

您可以构建正则表达式来为您执行此操作:

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

这会将pattern1pattern2视为文字文字,并在第一个capturing group中捕获模式之间的文字。如果您想使用正则表达式,可以删除Pattern.quote(),但如果您这样做,保证任何内容。

您可以通过向regexString添加标记来添加对匹配应如何进行的自定义。

  • 如果您希望Unicode识别不区分大小写匹配,请在(?iu)的开头添加regexString,或者向Pattern.compile方法提供Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE标记。
  • 如果要捕获内容,即使两个分隔字符串跨行显示,也请在(?s)之前添加(.*?),即"(?s)(.*?)",或提供Pattern.DOTALL标记Pattern.compile方法。

然后编译正则表达式,获取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));
}

请注意,如果您使用上述方法在此输入foo中搜索barfoo text foo text bar text bar之间的文字,您将获得一个匹配,即 text foo text 

答案 1 :(得分:10)

这是一个完成所有工作的单行程序:

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

细分是:

  1. 将所有内容删除至pattern1(第一项不需要以空字符串结尾)
  2. 在pattern2和pattern1(或输入结束)之间拆分输入(非贪婪.*?
  3. 使用实用程序方法Arrays.asList()生成List<String>
  4. 这是一些测试代码:

    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]
    

答案 2 :(得分: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 <
> <