我可以拥有这三种字符串
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的第一个字符。
我做错了什么?
答案 0 :(得分:2)
只需移除ALPHA
,BETA
和GAMMA
周围的括号,因为它们代表字符类,即[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];