如何匹配由“| e |”符号分割的字符串

8qgya5xd  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(494)

我已经写了一个程序来分割一个字符串 |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])));
}

但它似乎是不正确的(因为我调试程序,然后我得到不正确的结果)。我觉得我的错误是在不正确的正则表达式部分。所以我寻找一个合适的正则表达式来解析上面的字符串。
任何帮助都将不胜感激。谢谢。

carvr3hs

carvr3hs1#

解决方案

进行两个更改: "[^ |o| ]"
"( \|o\| )" "[^|e|]""(\\|e\\|)" 通过这些更改,您的代码将如下所示:

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])));
}

解释

你的正则表达式有三个问题。 String#split(String) 围绕与给定正则表达式匹配的子序列进行拆分。因此,如果您想拆分/删除 |o| ,那么您的正则表达式需要匹配 |o| . 但是,似乎您认为(错误地)regex应该匹配除分割子序列之外的所有内容,因为您使用的是一个取反字符类。别那么做。
为了在regex中匹配(或排除)一个完整的子字符串,子字符串必须包含在圆括号中,例如。 (substring) . 括号表示捕获组。如果使用括号(例如。 [characters] ),则它是一个字符类,相当于说“这些单个字符中的任何一个”,而不是“这个完整的子字符串”。
人物 | 是正则表达式中的控制字符。这意味着如果你想匹配 | 而不是用它来表示regex交替,那么你必须逃避它。既然这是java,就必须避开 \ 所以java不会试图改变 \| 在字符串到达regex引擎之前,将其转换为一些特殊的java字符。因此, \\| .

8ehkhllq

8ehkhllq2#

为了在正则表达式中引用特殊字符,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

相关问题