1

我想知道我必须使用哪个正则表达式。方法内部的代码是:

while( (line = bReader.readLine()) != null){
    line2 = line.replaceAll("[\\)][\\|]","R");
    numbers = line2.split("[\\|]");
}
int num = numbers.length;

我想要的是当line等于

(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)|

它必须返回 num =0因为所有实例)|都被替换R并且没有|剩余。我得到的是 num = 1

line等于

(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|A#,B#,C#,D#, E#,F#,G#,  |  ,A,  , ,   ,  ,  ,  ,  ,  ,  , ,   ,  ,  ,  |

它必须返回 num =因为在替换by之后2有两个实例。我在这里得到的确实是 num = 。我希望有人能给我解决方案。|)|R2

4

2 回答 2

1

如果您试图找出|String 中存在多少未预测的)标记,则可以删除这些标记并检查字符串长度的变化情况。要检测此类管道,您可以使用负后视

int num = s.length() - s.replaceAll("(?<![)])[|]", "").length();
于 2013-03-25T17:47:41.957 回答
0

如果您String在不存在的分隔符上拆分 a ,那么您将取回原来的String

public static void main(String[] args) throws SQLException {
    System.out.println(Arrays.toString("My string without pipes".split("\\|")));
}

输出:

[My string without pipes]

如果您尝试拆分字符串以您结尾的字符,则不会String在以下内容中得到空Array

public static void main(String[] args) throws SQLException {
    System.out.println(Arrays.toString("My string ending in pipe|".split("\\|")));
}

输出:

[My string ending in pipe]

所发生的只是最后的分隔符被删除。

所以你的逻辑是错误的。您在第二次检查中得到正确答案的原因不是因为检查正确,而是因为管道恰好在最后。

通常,您不会在Stringusing中获得分隔符的数量,除非您以分隔符开头或结尾,否则您spilt将获得该数字- 在这种情况下,它将被简单地删除。+1String

您需要做的是使用正则表达式搜索所有前面没有右括号的管道。您可以通过消极的后视来做到这一点:

public static void main(String[] args) throws SQLException {
    final String s1 = "(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|(Ab,Ab,Ab),(Bb,Bb,Cb),(Bb,Bb,Cb),(Bb,Bb,Cb)|";
    final String s2 = "(A#,A#,A#),(B#,B#,C#),(B#,B#,C#),(Bb,Bb,Cb)|A#,B#,C#,D#, E#,F#,G#,  |  ,A,  , ,   ,  ,  ,  ,  ,  ,  , ,   ,  ,  ,  |";
    final Pattern pattern = Pattern.compile("(?<!\\))\\|");
    int count = 0;
    final Matcher matcher = pattern.matcher(s1);
    while (matcher.find()) {
        ++count;
    }
    System.out.println(count);
    count = 0;
    matcher.reset(s2);
    while (matcher.find()) {
        ++count;
    }
    System.out.println(count);
}

输出:

0
2
于 2013-03-25T17:51:44.190 回答