如何使用java使用正则表达式在括号内搜索文本?

时间:2013-06-30 20:53:32

标签: java

使用Java 如何在类似的表达式中搜索括号之间的文本 "Request ECUReset for [*11 01]"

我想提取“11 01” 但我不确切知道括号内文本的长度。

可能是:"Request ECUReset for [*11 01]" 或:"Request ECUReset for [*11]" 或:"Request ECUReset for [*11 01 10]" 或任何长度

任何帮助吗??

2 个答案:

答案 0 :(得分:1)

如果字符串具有固定格式,String#substring()就足够了:

Online demo here.

public static void main(String[] args) {
    String input1 = "Request ECUReset for [*11 01]";
    String output1 = input1.substring(input1.indexOf("[*")+"[*".length(), input1.indexOf("]", input1.indexOf("[*")));
    System.out.println(input1 + " --> " + output1);

    String input2 = "Request ECUReset for [*11]";
    String output2 = input2.substring(input2.indexOf("[*")+"[*".length(), input2.indexOf("]", input2.indexOf("[*")));
    System.out.println(input2 + " --> " + output2);

    String input3 = "Request ECUReset for [*11 01 10]";
    String output3 = input3.substring(input3.indexOf("[*")+"[*".length(), input3.indexOf("]", input3.indexOf("[*")));
    System.out.println(input3 + " --> " + output3);
}

输出:

Request ECUReset for [*11 01] --> 11 01
Request ECUReset for [*11] --> 11
Request ECUReset for [*11 01 10] --> 11 01 10



或者,如果输入不太稳定,您可以使用正则表达式(通过实用程序Pattern类)来匹配括号之间的数字:

<强> Online demo here.

import java.util.regex.*;
public class PatternBracket {
    public static void main(String[] args) {
        String input1 = "Request ECUReset for [*11 01]";
        String output1 = getBracketValue(input1);
        System.out.println(input1 + " --> " + output1);

        String input2 = "Request ECUReset for [*11]";
        String output2 = getBracketValue(input2);
        System.out.println(input2 + " --> " + output2);

        String input3 = "Request ECUReset for [*11 01 10]";
        String output3 = getBracketValue(input3);
        System.out.println(input3 + " --> " + output3);
    }
    private static String getBracketValue(String input) {
        Matcher m = Pattern.compile("(?<=\\[\\*)[^\\]]*(?=\\])").matcher(input);
        if (m.find()) {
            return m.group();
        }
        return null;
    }
}

(与上面相同的输出)

答案 1 :(得分:0)

假设您没有任何嵌套括号,并且想要在*之后忽略[,您可以使用例如此示例中的组

String data="Request ECUReset for [*11 01]";
Matcher m=Pattern.compile("\\[\\*?(.*?)\\]").matcher(data);
while (m.find()){
    System.out.println(m.group(1));
}

此外,如果您知道只有一个匹配的部分,则可以使用单行

System.out.println(data.replaceAll(".*\\[\\*?(.*?)\\].*", "$1"));
相关问题