2017-01-04 26 views
1

我已经写了一个程序来分割一个字符串|o||e|的标志。如何匹配由“| e |”分割的字符串sign

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

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

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

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

+3

'.split(“\\ | [oe] \\ |”)' – Tushar

+0

*我觉得我的错误是在不正确的正则表达式部分* - 是的,模式是错误的,因为否定字符类仍然匹配除了在char类中定义的字符之外,只有一个字符。 –

+0

似乎这是正确的正则表达式,但请注意,我在'| o |'周围有一个空格,如何插入这些空格以进行匹配? @Tushar –

回答

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 
+0

谢谢。一个不同的解决方案:)我继续使用这个溶胶。 –

0

解决方案

做两个修改:

  1. "[^ |o| ]""(\\|o\\|)"
  2. "[^|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]))); 
} 

说明

有三个问题,你的正则表达式。周围的子序列

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