正则表达式分裂一个词

时间:2013-12-17 16:49:26

标签: java regex

我正在努力让String.split()做我想做的事。

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

我用来测试我的正则表达式的输入字符串如下所示:

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

我想从str.split(regex)获得的结果是一个包含“world”和“day”字样的数组;

我尝试使用前瞻(?<=special\:)(\w+)进行此操作,但这会将字符串拆分为我要查找的字词。如何反转此表达式以获得我正在寻找的结果以及前瞻和反向预测的确切做法?

3 个答案:

答案 0 :(得分:4)

在这种情况下使用split会产生一些问题:

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

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

    ["", "world", "day"]
    
  4. 要避免这种情况,请使用更直观的方法:不要找到您想要的所有内容,而只找到您感兴趣的部分。为此,请使用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
    

答案 1 :(得分: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]);
        }
    }

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

答案 2 :(得分: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;
}