使用REGEX仅拆分特定单词

时间:2014-03-21 11:30:05

标签: java regex

Vector<Object> ob = new Vector<Object>();
        Pattern p= Pattern.compile("[A-Za-z]+|[0-9]|| |(Ted)|(Barry)");
        Matcher m= p.matcher(s);

        while(m.find()){
            ob.add(m.group());
        }

大家好, 我试图让REGEX将所有单词和数字分成单独的标记,但我希望将某些复合词分开。

所以上面的代码我的问题是我想要

xrayTed

分成

xrayTed

但它已经接受了整个令牌 谢谢你的时间

2 个答案:

答案 0 :(得分:1)

正则表达式从左到右解释,所以如果是正则表达式引擎

regex1|regex2|regex3

将首先尝试查找regex1的匹配项,然后尝试查找regex2的匹配项,最后regex3(如果未成功regex2)。

因此,在您的情况下,xrayTed将与[A-Za-z]+匹配。如果您要查找TedBarry具有更高的优先级,请在[A-Za-z]+之前移动它,以便尝试

Pattern.compile("(Ted)|(Barry)|[A-Za-z]+|[0-9]|| ");

同样在您的情况下,如果它会尝试匹配[A-Za-z]+Ted的第一个字母,则必须中断匹配Barry。为此,您可以使用((?!Ted|Barry)[A-Za-z])+

negative-look-ahead机制

请尝试使用

Pattern.compile("(Ted)|(Barry)|((?!Ted|Barry)[A-Za-z])+|[0-9]|| ");

答案 1 :(得分:0)

我认为此代码可以为您提供帮助:

Pattern p= Pattern.compile("([A-Za-z]+|[0-9])(Ted|Barry)|[A-Za-z]+|[0-9]");
Matcher m= p.matcher(s);
while(m.find()) {
    if(m.group(2) != null) {
        ob.add(m.group(1));
        ob.add(m.group(2));
    } else {
        ob.add(m.group());
    }
}