我已经写了一个程序来分割一个字符串 |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条答案
按热度按时间carvr3hs1#
解决方案
进行两个更改:
"[^ |o| ]"
➔"( \|o\| )"
"[^|e|]"
➔"(\\|e\\|)"
通过这些更改,您的代码将如下所示:解释
你的正则表达式有三个问题。
String#split(String)
围绕与给定正则表达式匹配的子序列进行拆分。因此,如果您想拆分/删除|o|
,那么您的正则表达式需要匹配|o|
. 但是,似乎您认为(错误地)regex应该匹配除分割子序列之外的所有内容,因为您使用的是一个取反字符类。别那么做。为了在regex中匹配(或排除)一个完整的子字符串,子字符串必须包含在圆括号中,例如。
(substring)
. 括号表示捕获组。如果使用括号(例如。[characters]
),则它是一个字符类,相当于说“这些单个字符中的任何一个”,而不是“这个完整的子字符串”。人物
|
是正则表达式中的控制字符。这意味着如果你想匹配|
而不是用它来表示regex交替,那么你必须逃避它。既然这是java,就必须避开\
所以java不会试图改变\|
在字符串到达regex引擎之前,将其转换为一些特殊的java字符。因此,\\|
.8ehkhllq2#
为了在正则表达式中引用特殊字符,java提供了一种方法:
java.util.regex.Pattern#quote
应用上述例子,这可能导致输出: