REGEX:如何逃避[]?

时间:2012-03-30 06:37:49

标签: java regex

我正在处理像"[ro.multiboot]: [1]"这样的字符串。如何从这个字符串中选择1(它也可以是0)?

我正在寻找Java中的正则表达式。

2 个答案:

答案 0 :(得分:4)

通常,你会做类似的事情(假设0和1是唯一的选择):

^.*\[([01])\].*$

如果您只想要ro.multiboot的值,可以将其更改为:

^.*\[ro.multiboot\].*\[([01])\].*$

(取决于任何非括号内的东西的复杂程度)。

如果它们为零或一,它们基本上只提取方括号之间的值,并将其捕获到捕获变量中,以便您可以使用它。

当然,正则表达式不是世界范围的标准,也不是您使用它的环境。这意味着它在很大程度上取决于您的实际环境,以便您实际编写代码。


对于Java,以下示例程序可能有所帮助:

import java.util.regex。*;

class Test {
    public static void main(String args[]) {
        Pattern p = Pattern.compile("^.*\\[ro.multiboot\\].*\\[([01])\\].*$");
        String str;
        Matcher m;

        str = "[ro.multiboot]: [0]";
        m = p.matcher (str);
        if (m.find()) {
            System.out.println ("str0 has " + m.group(1));
        }

        str = "[ro.multiboot]: [1]";
        m = p.matcher (str);
        if (m.find()) {
            System.out.println ("str1 has " + m.group(1));
        }

        str = "[ro.multiboot]: [2]";
        m = p.matcher (str);
        if (m.find()) {
            System.out.println ("str2 has " + m.group(1));
        }
    }
}

这导致(如预期的那样):

str0 has 0
str1 has 1

答案 1 :(得分:0)

@ paxdiablo的正则表达式是正确的,但完整的答案是“如何从这个字符串中选择1(它也可以是0)?”是:

1。非常简单的解决方案

    String input = "[ro.multiboot]: [1]";
    String matched = input.replaceFirst( "^.*\\[ro.multiboot\\].*\\[([01])\\].*$", "$1" );

2。相同的功能,更复杂,但性能更好

    String input = "[ro.multiboot]: [1]";
    Pattern p = Pattern.compile( "^.*\\[ro.multiboot\\].*\\[([01])\\].*$" );
    Matcher m = p.matcher( input );
    String matched = null;
    if ( m.matches() ) matched = m.group( 1 );

性能更好,因为模式只编译一次(例如,当您匹配数组操作符String s)时;

备注:

  • 在这两个示例中,该群组都是()之间的正则表达式的一部分(如果没有转义)
  • 在Java中你必须使用\\[,因为\[返回错误 - 它不是String的正确转义序列