0

我再次需要一些帮助,因为我无法弄清楚如何让正则表达式运行。

这是我要拆分的字符串:

String str = "ERR||||TEST|GET|POST|UPDATE|"

我有一个函数,它给定一个以 1 开头的字段索引,将在拆分字符串后返回该位置的字符串。但是问题是正则表达式不会返回分隔符之间的空字符串,因为这被计入字段索引。如何修改此正则表达式以包含这些空字段?

private static String extractField(String strt, int fieldNo)
{
    Pattern pattern = Pattern.compile("[^|]+");
    String str = strt.replaceAll("\\r", "");
    Matcher matcher = pattern.matcher(str);
    int i = 1;
    while (matcher.find()) {
        String fS = matcher.group().trim();
        System.out.println("Result: \"" + fS + "\"");
        if (i++==fieldNo) {
            return fS;
        }
    }
    return "";
}
4

4 回答 4

3

为什么不使用split?...

String[] x = str.split("\\|");
System.out.println(Arrays.toString(x));
于 2013-05-20T02:17:12.010 回答
1

做一个拆分 | 会产生你想要的。

像这样的东西:

    String s = "ERR||||TEST|GET|POST|UPDATE|";
    String [] a = s.split("\\|");
    for (int i=0; i<a.length; i++) {
      System.out.println(a[i]);
    }
于 2013-05-20T02:17:20.980 回答
1

当您正在寻找Pattern基于 - 的解决方案时,您可以使用正则表达式:

(?<=(^|\|))(.*?)(?=(\||$))

这些是积极的前瞻 ( (?=X)) 和积极的后瞻 ( (?<=X))。该磨机匹配两个|s 之间,或字符串开头 ( ^) 和 a|之间,或 a|和字符串结尾 ( $) 之间的任何内容。由于lookaheads 和look-behinds 是零宽度断言,它们不会包含|在组中。此外,?in.*?使它不贪婪。

代码:

private static String extractField(String strt, int fieldNo)
{
    Pattern pattern = Pattern.compile("(?<=(^|\\|))(.*?)(?=(\\||$))");
    String str = strt.replaceAll("\\r", "");
    Matcher matcher = pattern.matcher(str);
    int i = 1;
    while (matcher.find()) {
        String fS = matcher.group().trim();
        System.out.println("Result: \"" + fS + "\"");
        if (i++==fieldNo) {
            return fS;
        }
    }
    return "";
}

结果"ERR||||TEST|GET|POST|UPDATE|"

Result: "ERR"
Result: ""
Result: ""
Result: ""
Result: "TEST"
Result: "GET"
Result: "POST"
Result: "UPDATE"
Result: ""
于 2013-05-20T02:29:24.507 回答
1

您可以使用环视机制轻松升级您的正则表达式。试试这样吧[^|]+|(?<=[|])。附加部分的|(?<=[|])意思是“或之前的空字符串 |

感谢这个正则表达式,ERR||||TEST|GET|POST|UPDATE|你会发现

"ERR", "", "", "", "TEST", "GET", "POST", "UPDATE", ""

如果你不想要最后一个"",你可以使用[^|]+|(?<=[|])(?=[|]). (?<=[|])(?=[|])表示“两个之间存在的空字符串 |,因此此模式的结果将是

"ERR", "", "", "", "TEST", "GET", "POST", "UPDATE"
于 2013-05-20T03:52:45.280 回答