使用正则表达式从Java中的字符串中提取值

时间:2018-11-20 06:05:37

标签: java

我有一个字符串为a#1-b#2-c#3-d#4-e#5-f#6-g#7-h#8-i#9-j#0-k#10-l#11。 我想创建一个程序,如果我给定值a,那么它应该返回a#1;如果我给定b,那么它应该从给定的字符串中返回b#2。我对Java正则表达式非常陌生。

3 个答案:

答案 0 :(得分:3)

是的,一个简单的正则表达式就可以解决问题。只需将您的输入添加到匹配#的正则表达式前,然后加上一些数字(假设是模式):

String str = "a#1-b#2-c#3-d#4-e#5-f#6-g#7-h#8-i#9-j#0-k#10-l#11";
String input = "a";
Matcher m = Pattern.compile(input + "#\\d+").matcher(str);
if (m.find()) {
    System.out.println(m.group());
}

答案 1 :(得分:0)

使用RegExpo进行此类简单任务可能会产生开销。只是字符串搜索:

public static String get(char ch) {
    final String str = "a#1-b#2-c#3-d#4-e#5-f#6-g#7-h#8-i#9-j#0-k#10-l#11";
    int pos = str.indexOf(ch);

    if (pos < 0)
        return null;

    int end = str.indexOf('-', pos);
    return end < 0 ? str.substring(pos) : str.substring(pos, end);
}

答案 2 :(得分:0)

并不比@shmosel的答案更好,但是如果您需要重复提取值,则可以一次构建一次Map,那么每次检索都会更快(但是初始Map的构建会很慢):-

Map<String, String> map = Arrays.stream(str.split("-"))
        .collect(Collectors.toMap(o -> o.substring(0, o.indexOf('#')).trim(), Function.identity()));

这是完整的代码:-

String str = "a#1-b#2-c#3-d#4-e#5-f#6-g#7-h#8-i#9-j#0-k#10-l#11";
Map<String, String> map = Arrays.stream(str.split("-"))
        .collect(Collectors.toMap(o -> o.substring(0, o.indexOf('#')).trim(), Function.identity()));
System.out.println(map.get("a"));

输出:a#1