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

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

最佳答案

正则表达式是从左到右解释的,因此如果正则表达式引擎是

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。为此,您可以使用negative-look-ahead机制,例如((?!Ted|Barry)[A-Za-z])+

所以尝试

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

09-25 17:35