我编写了一个程序,用|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])));
}
但它似乎是不正确的(因为我调试程序然后我得到不正确的结果)。我觉得我的错误在于正确的正则表达式部分。所以我寻找一个正确的正则表达式来解析上面的字符串。
任何帮助将不胜感激。感谢。
答案 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)
进行两项更改:
"[^ |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|
。但是,您似乎(错误地)认为正则表达式应该与除了子序列之外的所有其他匹配,因为您使用的是否定字符类。不要这样做。(substring)
。括号表示capture group。如果你使用括号(例如[characters]
),则它是character class,相当于说&#34;这些个别字符中的任何一个&#34;而不是&#34;这个完整的子串&#34;。|
是正则表达式中的控制字符。这意味着如果你想匹配文字|
而不是用它来表示正则表达式alternation,那么你必须逃避它。由于这是Java,因此您必须转义\
,以便Java在字符串甚至到达正则表达式引擎之前不会尝试将\|
更改为某个特殊的Java字符。因此,\\|
。