如何只查找三个不同选项的句子的第一个单词

时间:2014-11-20 17:54:28

标签: java regex

我可以拥有这三种字符串

ALPHA_whatever_1234567

BETA_whateverDifferent_7654321

GAMMA_anotherOption_1237654

我想从字符串中提取它们的开头,无论是ALPHA,BETA还是GAMMA。

所以,例如,我想得到:

ALPHA_whatever_1234567 -> ALPHA

BETA_whateverDifferent_7654321 -> BETA

GAMMA_anotherOption_1237654 -> GAMMA

我想使用正则表达式,我尝试了类似的东西

private static final Pattern PATTERN = Pattern.compile("(.*)_.*");

但它对某些字符串不起作用。我通过

恢复了开始
Matcher m = PATTERN.matcher(string);
m.find(1);

我也试过这个模式:

private static final Pattern PATTERN = Pattern.compile("([ALPHA]|[BETA]|[GAMMA])_.*");

但它只返回String的第一个字符。

我做错了什么?

5 个答案:

答案 0 :(得分:2)

只需移除ALPHABETAGAMMA周围的括号,因为它们代表字符类,即[ALPHA]将匹配字母A,L,P, H或A.

private static final Pattern PATTERN = Pattern.compile("(ALPHA|BETA|GAMMA)_.*");

答案 1 :(得分:1)

你的正则表达式不起作用,因为点.消耗太多,吃掉了下划线。以下是解决问题的方法:

private static final Pattern PATTERN = Pattern.compile("([^_]*)_.*");

另一种选择是使用"不情愿的"星号的限定符,但可能导致catastrophic backtracking

您的其他解决方案错误地使用了字符类[]。正确的表达式没有方括号,如下所示:

private static final Pattern PATTERN = Pattern.compile("(ALPHA|BETA|GAMMA)_.*");

答案 2 :(得分:1)

正则表达式中的

[...]character class。字符类只能匹配单个字符。

所以[ALPHA]的确意味着"匹配其中一个字符:A,L,P,H,A"

如果删除括号,则它将匹配整个单词:

(ALPHA|BETA|GAMMA)_.*

答案 3 :(得分:1)

如果您不坚持使用正则表达式,可以尝试一下:

String firstWord = myString.split("_")[0];

myString包含您的字符串。

答案 4 :(得分:0)

String strr = "ALPHA_whatever_1234567";
String[] result = strr.split("_");
return result[0];