2013-12-17 188 views
0

我很努力让String.split()做我想做的事情。正则表达式分裂一个词

我有一个用空格分隔的单词串的输入。有些词有特殊的功能。他们看起来像这样:“特殊:单词”。

我使用来测试我的正则表达式输入的字符串看起来是这样的:

String str = "Hello wonderful special:world what a great special:day";

我想从str.split(regex)得到的结果是上写着“世界”和“天”的阵列;

我试着用lookahead (?<=special\:)(\w+)这样做,但是这会将字符串拆分为我正在寻找的单词。我如何反转这个表达式来获得我期待的结果以及预测和反向预测的确切结果?

+5

我不会用'split'为了这。使用'Pattern'和'Matcher'。 –

回答

0

尝试PatternMatcher

String searchPattern = "Hello wonderful special:world what a great special:day"; 
    Pattern pa = Pattern.compile(":[a-zA-Z0-9]+"); 
    Matcher ma = pa.matcher(searchPattern); 
    while(ma.find()){ 
     System.out.println(ma.group().replaceFirst(":",""));  
    } 

输出

world 
day 

通过使用split(),我们可以这样做:

String searchPattern1 = "Hello wonderful special:world what a great special:day"; 
    for(String i:searchPattern1.split("\\s")){ 
     if(i.contains(":")){ 
      System.out.println(i.split[1]); 
     } 
    } 

这里我们也得到与上述相同的输出。

4

在这种情况下使用split会产生几个问题:

  1. 过于复杂的正则表达式匹配,我们应该拆分后

    Hello wonderful special:world what a great special:day 
    ^^^^^^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^ 
    
  2. 分割部分的第一个元素是空字符串""因为拆分不会像最后一个空元素那样修剪第一个空元素,因此您的结果将是

    ["", "world", "day"] 
    

为了避免这种使用更直观的方法:不是寻找一切,是不是你想要的部分,只找到你感兴趣的部分要做到这一点使用PatternMatcher类。下面是例子,你如何能找到所有你的特殊的话:

String str = "Hello wonderful special:world what a great special:day"; 

Pattern p = Pattern.compile("\\b\\w+:(\\w+)\\b");//word after : will be in group 1 
Matcher m = p.matcher(str); 
while(m.find()){//this will iterate over all found substrings 
    //here we can use found substrings 
    System.out.println(m.group(1)); 
} 

输出:

world 
day 
+0

但你不能说:在':'和':'后面的单词之间的所有单词? – JNK

+0

@JNK'':'和':'之后的单词之间的所有单词,但在开始时您没有任何'special:word',那么它将如何匹配'Hello wonderful special:'?此外,这样的表达意味着“在之前有':someWord''和':'之后”的词,但同时你不想在匹配中包含'someWord',因为你不希望这个记号是通过拆分删除。所以你将不得不使用环视机制,比如'(?<=:\\ w +)。*?(?= :)',但是在Java中你必须设置最大长度的look-behind,所以'\\ w +'不会编译。模式/匹配器解决方案对于这种情况更好。 – Pshemo

0

使用行话和匹配,简单的例子

public static ArrayList<String> parseOut(String s) 
{ 
    ArrayList<String> list = new ArrayList<String>(); 
    String regex = "([:])(\\w+)"; 
    Pattern pattern = Pattern.compile(regex); 
    Matcher matcher = pattern.matcher(s); 
    while (matcher.find()){ 
     list.add(matcher.group().substring(1)); 
    } 
    return list; 
}