如何匹配由“| e |”拆分的字符串标志

时间:2017-01-04 07:31:24

标签: java regex string

我编写了一个程序,用|o||e|符号分割字符串。

这是我的整个字符串(我想要处理):

code|e|0.07610 |o| p|e|0.02225 |o| li|e|0.02032 |o| applet|e|0.01305 |o| pre|e|0.01289

我编写了一个实用程序函数来解析上面的字符串,以下是这个实用程序函数的一部分:

String [] trs = tgs[1].split("[^ |o| ]"); //tgs[1] have the whole string
for (int i=0 ; i<9; i++) {
    String t = trs[i].split("[^|e|]")[0];
    e.add(new ProbTranslate(t, Double.parseDouble(trs[i].split("[^|e|]")[1])));
}

但它似乎是不正确的(因为我调试程序然后我得到不正确的结果)。我觉得我的错误在于正确的正则表达式部分。所以我寻找一个正确的正则表达式来解析上面的字符串。

任何帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:2)

要引用正则表达式中的特殊字符,Java提供了一种方法:java.util.regex.Pattern#quote

应用上面的示例,例如,导致

import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {
        final String[] split1 = "code|e|0.07610 |o| p|e|0.02225 |o| li|e|0.02032 |o| applet|e|0.01305 |o| pre|e|0.01289".split(Pattern.quote(" |o| "));

        for (int i = 0; i < split1.length; ++i) {
            final String name = split1[i];
            final String[] split2 = name.split(Pattern.quote("|e|"));

            for (int j = 0; j < split2.length; ++j) {
                System.out.println(split2[j]);
            }

            System.out.println("");
        }
    }
}

输出:

code
0.07610

p
0.02225

li
0.02032

applet
0.01305

pre
0.01289

答案 1 :(得分:0)

解决方案

进行两项更改:

  1. "[^ |o| ]""( \\|o\\| )"
  2. "[^|e|]""(\\|e\\|)"
  3. 通过这些更改,您的代码将如下所示:

    String [] trs = tgs[1].split("( \\|o\\| )");
    for (int i=0 ; i<9; i++) {
        String t = trs[i].split("(\\|e\\|)")[0];
        e.add(new ProbTranslate(t, Double.parseDouble(trs[i].split("(\\|e\\|)")[1])));
    }
    

    解释

    你的正则表达式存在三个问题。

    1. String#split(String)拆分匹配给定正则表达式的子序列。因此,如果您想要拆分/删除每个|o|,那么您的正则表达式需要匹配|o|。但是,您似乎(错误地)认为正则表达式应该与除了子序列之外的所有其他匹配,因为您使用的是否定字符类。不要这样做。
    2. 为了在正则表达式中匹配(或排除)完整的子字符串,子字符串必须包含在括号中,例如(substring)。括号表示capture group。如果你使用括号(例如[characters]),则它是character class,相当于说&#34;这些个别字符中的任何一个&#34;而不是&#34;这个完整的子串&#34;。
    3. 字符|是正则表达式中的控制字符。这意味着如果你想匹配文字|而不是用它来表示正则表达式alternation,那么你必须逃避它。由于这是Java,因此您必须转义\,以便Java在字符串甚至到达正则表达式引擎之前不会尝试将\|更改为某个特殊的Java字符。因此,\\|