任何人都知道为什么String.matches(regexp)不能处理ANSI彩色字符串?

时间:2015-05-24 18:57:46

标签: java regex string

我正在尝试在找到以下字符时匹配正则表达式:|<>-字符串数组中的split("\n");我的代码如下:

String[] s_array = perged.split("\n");

    for (String s_array1 : s_array) {

        if (s_array1.matches("(.*)[|><-](.*)")) {

            System.out.println("~m~" + s_array1);

        } else {

           System.out.print("~false~");

           System.out.println(s_array1);
        }
    }

尝试匹配的众多字符串之一是:

 <---------^--------->
 | HH#...........### |  Exits

这些应该匹配,如果我只是复制粘贴字符串,他们将使用我的regexp测试为true。但是,正在解析的实际字符串中包含ANSI颜色代码的\u001B个字符。我相信这些都是导致问题的原因。因此我尝试(.*)而不是(\\D*),而且仍然没有考虑'.'可能不接受\ u001B字符。

  if (s_array1.matches("(\\D*)[|><-](\\D*)")) {

正在解析的实际字符串如下所示:

[37;1m<[0m[34;1m---------[0m[37;1m^[0m[34;1m---------[0m[37;1m>[0m[34;1m[0m\u000D\u000A
 [34;1m| [0m[0m[35mHH[0m[0m[37m#[0m[0m[33m..........[0m[1;32mp[0m[0m[37m###[0m[34;1m |[0m  Exits:  \u000D\u000A

非常感谢任何帮助。我并不致力于使用匹配,我只是不想做

 if(s_array1.contains("<") || s_array1.contains(">") ....

如果存在同类型的未来问题,我更倾向于采用更先进的方式。

修改

我现在尝试使用临时字符串来删除它仍在评估为false的转义符:

String[] s_array = perged.split("\n");

    for (String s_array1 : s_array) {

        String temp=s_array1.replaceAll("\u001B", "");
        System.out.println(temp);
        if (temp.matches("(.*)[|><-](.*)")) {

            System.out.println("~m~" + s_array1);

        } else {

           System.out.print("~false~");

           System.out.println(s_array1);

        }

    }

一个简单的测试是评估为true所以我不确定是否有一个字符或字节可以强制表达式为false

String s="[37;1m<[0m[34;1m---------[0m[37;1m^[0m[34;1m---------[0m[37;1m>[0m[34;1m[0m  Loc:    [36mDortlewall (Crystite plaza)                    [m";
    if(s.matches("(.*)[|><-](.*)")){
        System.out.println("It was true yay!!");
    }else
    System.out.println("It was false BOOO:");

1 个答案:

答案 0 :(得分:0)

我更改了if条件以使用java.util.regex.Pattern

    String perged = "[37;1m<[0m[34;1m---------[0m[37;1m^[0m[34;1m---------[0m[37;1m>[0m[34;1m[0m  Loc:    [36mDortlewall (Crystite plaza)                    [m";
    String[] s_array = perged.split("\n");

    for (String s_array1 : s_array) {

        if (Pattern.matches("(.*)[|><-](.*)" , s_array1)) {

            System.out.println("~m~" + s_array1);

        } else {

           System.out.print("~false~");

           System.out.println(s_array1);
        }
    }


}

打印

~m~[37;1m<[0m[34;1m---------[0m[37;1m^[0m[34;1m---------[0m[37;1m>[0m[34;1m[0m Loc: [36mDortlewall (Crystite plaza) [m

如果在\n之前碰巧遇到Loc:,结果将是:

~m~[37;1m<[0m[34;1m---------[0m[37;1m^[0m[34;1m---------[0m[37;1m>[0m[34;1m[0m
~false~Loc: [36mDortlewall (Crystite plaza)