在Java中使用不同字符类的正则表达式

时间:2016-10-30 17:10:33

标签: java regex

char comando[4];

使用命令

运行时的上述代码
public class MainTest {
    public static void main( String ... args ) {
        Pattern p = Pattern.compile(args[0]);
        Matcher m = p.matcher(args[1]);
        while ( m.find() )
            System.out.print(m.start()+" ");
        System.out.println();
    }
}

产量

java MainTest "\b" "^23 *$76 bc"
java MainTest "\B" "^23 *$76 bc"
java MainTest "\S" "^23 *$76 bc"
java MainTest "\W" "^23 *$76 bc"

虽然我几乎确定它会

1 3 5 6 7 9 
0 2 4 8 
0 1 2 4 5 7 8 
0 3 4 6 

好的,1 3 6 8 9 11 0 2 4 5 7 10 0 1 2 4 5 6 7 9 10 0 3 4 5 8 表示\w[0-9A-Za-z_]应与\b\w边界匹配,\W应与空格匹配不在\W下划线的东西。那么,为什么我得到这些结果呢?我来到这里是为了解释我对Java中正则表达式的一些严重误解。

2 个答案:

答案 0 :(得分:1)

@Andreas是对的。问题出在Linux shell中:$ 7被替换为空,命令行参数变为" ^ 23 * 6 bc"。

答案 1 :(得分:0)

我在Linux和Windows上执行了相同的程序。 我发现,Linux shell在符号 $ 之后替换了 double 引用的参数 与他们的价值观(在你的情况下,如安德烈亚斯所解释的那样)。 以下是适用于两种操作系统的示例代码

    System.out.println("0:"+args[0]);
    System.out.println("1:"+args[1]);
    Pattern p = Pattern.compile(args[0]);
    Matcher m = p.matcher(args[1]);
    while ( m.find() )
        System.out.print(m.start()+" ");
    System.out.println();

并使用单引号参数执行

java MainTest '\b' '^23 *$76 bc'
java MainTest '\B' '^23 *$76 bc'
java MainTest '\S' '^23 *$76 bc'
java MainTest '\W' '^23 *$76 bc'