使用Java使用正则表达式查找更大字符串的子字符串

时间:2009-03-01 22:58:05

标签: java regex string

如果我有这样的字符串:

FOO[BAR]

我需要一种通用的方法来从字符串中获取“BAR”字符串,这样无论方括号之间的字符串是什么,它都能够获得字符串。

e.g。

FOO[DOG] = DOG
FOO[CAT] = CAT

12 个答案:

答案 0 :(得分:228)

你应该能够使用非贪婪的量词,特别是* ?.你可能想要以下内容:

Pattern MY_PATTERN = Pattern.compile("\\[(.*?)\\]");

这将为您提供一个与您的字符串匹配的模式,并将文本放在第一组的方括号内。有关详细信息,请查看Pattern API Documentation

要提取字符串,您可以使用以下内容:

Matcher m = MY_PATTERN.matcher("FOO[BAR]");
while (m.find()) {
    String s = m.group(1);
    // s now contains "BAR"
}

答案 1 :(得分:30)

非正则表达方式:

String input = "FOO[BAR]", extracted;
extracted = input.substring(input.indexOf("["),input.indexOf("]"));

或者,为了更好的性能/内存使用(感谢Hosam):

String input = "FOO[BAR]", extracted;
extracted = input.substring(input.indexOf('['),input.lastIndexOf(']'));

答案 2 :(得分:24)

这是一个有效的例子:

RegexpExample.java

package org.regexp.replace;

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

public class RegexpExample
{
    public static void main(String[] args)
    {
        String string = "var1[value1], var2[value2], var3[value3]";
        Pattern pattern = Pattern.compile("(\\[)(.*?)(\\])");
        Matcher matcher = pattern.matcher(string);

        List<String> listMatches = new ArrayList<String>();

        while(matcher.find())
        {
            listMatches.add(matcher.group(2));
        }

        for(String s : listMatches)
        {
            System.out.println(s);
        }
    }
}

显示:

value1
value2
value3

答案 3 :(得分:5)

如果您只需要获取[]之间的任何内容,就可以使用\[([^\]]*)\]这样的内容:

Pattern regex = Pattern.compile("\\[([^\\]]*)\\]");
Matcher m = regex.matcher(str);
if (m.find()) {
    result = m.group();
}

如果您需要格式为 identifier + [ + content + ] ,那么只有当标识符为字母数字时才能限制提取内容:

[a-zA-Z][a-z-A-Z0-9_]*\s*\[([^\]]*)\]

这将验证Foo [Bar]myDevice_123["input"]等内容。

主要问题

主要问题是当你想要提取这样的内容时:

FOO[BAR[CAT[123]]+DOG[FOO]]

正则表达式无效,将返回BAR[CAT[123FOO 如果我们将正则表达式更改为\[(.*)\],那么我们就可以了,但是如果您尝试从更复杂的内容中提取内容,例如:

FOO[BAR[CAT[123]]+DOG[FOO]] = myOtherFoo[BAR[5]]

没有一个正则表达式可以工作。

在所有情况下提取正确内容的最准确的正则表达式要复杂得多,因为它需要平衡[]对并为您提供内容。

更简单的解决方案

如果您的问题变得复杂且[]的内容任意,您可以改为平衡[]对,并使用普通旧代码提取字符串而不是正则表达式:

int i;
int brackets = 0;
string c;
result = "";
for (i = input.indexOf("["); i < str.length; i++) {
    c = str.substring(i, i + 1);
    if (c == '[') {
        brackets++;
    } else if (c == ']') {
        brackets--;
        if (brackets <= 0) 
            break;
    }
    result = result + c;
}   

这是伪代码而不是真正的代码,我不是Java编码器,所以我不知道语法是否正确,但它应该很容易改进。
重要的是,此代码应该有效,并允许您提取[]的内容,无论它多么复杂。

答案 4 :(得分:5)

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

public static String get_match(String s, String p) {
    // returns first match of p in s for first group in regular expression 
    Matcher m = Pattern.compile(p).matcher(s);
    return m.find() ? m.group(1) : "";
}

get_match("FOO[BAR]", "\\[(.*?)\\]")  // returns "BAR"

public static List<String> get_matches(String s, String p) {
    // returns all matches of p in s for first group in regular expression 
    List<String> matches = new ArrayList<String>();
    Matcher m = Pattern.compile(p).matcher(s);
    while(m.find()) {
        matches.add(m.group(1));
    }
    return matches;
}

get_matches("FOO[BAR] FOO[CAT]", "\\[(.*?)\\]")) // returns [BAR, CAT]

答案 5 :(得分:2)

我认为你的正则表达式如下:

/FOO\[(.+)\]/

假设FOO将保持不变。

所以,把它放在Java中:

Pattern p = Pattern.compile("FOO\\[(.+)\\]");
Matcher m = p.matcher(inputLine);

答案 6 :(得分:1)

String input = "FOO[BAR]";
String result = input.substring(input.indexOf("[")+1,input.lastIndexOf("]"));

这将返回第一个'['和last']'

之间的值

Foo [Bar] =&gt;杆

Foo [Bar [test]] =&gt;酒吧[测试]

注意:如果输入字符串格式不正确,则应添加错误检查。

答案 7 :(得分:0)

假设其中没有其他结束方括号,/ FOO \ [([^ \]] *)\] /

答案 8 :(得分:0)

我在[]之间定义了我想要的最多非字符数。这些需要使用反斜杠进行转义(在Java中,这些需要再次转义),而非定义是一个字符类,因此在[]内(即{{1} }})。结果:

[^\\]]

答案 9 :(得分:0)

如果你想解析一些来自mYearInDB.toString()= [2013]的字符串,那就像它的工作那样它会给2013年

Matcher n = MY_PATTERN.matcher("FOO[BAR]"+mYearInDB.toString());
while (n.find()) {
 extracredYear  = n.group(1);
 // s now contains "BAR"
    }
    System.out.println("Extrated output is : "+extracredYear);

答案 10 :(得分:0)

这个正则表达式对我有用:

form\[([^']*?)\]

示例:

form[company_details][0][name]
form[company_details][0][common_names][1][title]

输出:

Match 1
1.  company_details
Match 2
1.  company_details

http://rubular.com/

上进行测试

答案 11 :(得分:0)

"FOO[DOG]".replaceAll("^.*?\\[|\\].*", "");

这将返回一个字符串 仅将字符串放在方括号内。

这将从方括号中删除所有外部字符串。

您可以在线测试以下Java示例代码: http://tpcg.io/wZoFu0

您可以从此处测试此正则表达式: https://regex101.com/r/oUAzsS/1