4

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

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

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

请问有什么帮助吗??

4

2 回答 2

1

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

在线演示在这里。

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类)来匹配括号之间的数字:

在线演示在这里。

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;
    }
}

(与上面相同的输出)

于 2013-06-30T21:07:10.630 回答
0

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

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

此外,如果你知道你只有一个匹配的部分,你可以使用 one-liner

System.out.println(data.replaceAll(".*\\[\\*?(.*?)\\].*", "$1"));
于 2013-06-30T21:00:08.867 回答