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

在Java中使用正则表达式从字符串中提取值,java,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正则表达式非常陌生。是的,一个简单的正则表达式就可以做到这一点。只需将输入前置到一个正则表达式,该正则表达式匹配#,后跟一些数字(假设是这样的模式): 是的,一个简单的正则表达式应该可以做到这一点。只需将输入前置到一个正则表达式,该正则表达式匹配#,后跟一些数字

我有一个字符串作为
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正则表达式非常陌生。

是的,一个简单的正则表达式就可以做到这一点。只需将输入前置到一个正则表达式,该正则表达式匹配
#
,后跟一些数字(假设是这样的模式):


是的,一个简单的正则表达式应该可以做到这一点。只需将输入前置到一个正则表达式,该正则表达式匹配
#
,后跟一些数字(假设是这样的模式):


对于这样简单的任务,使用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);
}
publicstaticstringget(charch){
最后一个字符串str=“a#1-b#2-c#3-d#4-e#5-f#6-g#7-h#8-i#9-j#0-k#10-l#”;
int pos=str.indexOf(ch);
如果(位置<0)
返回null;
int end=str.indexOf('-',pos);
返回端<0?str.substring(pos):str.substring(pos,end);
}

对于这样简单的任务,使用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);
}
publicstaticstringget(charch){
最后一个字符串str=“a#1-b#2-c#3-d#4-e#5-f#6-g#7-h#8-i#9-j#0-k#10-l#”;
int pos=str.indexOf(ch);
如果(位置<0)
返回null;
int end=str.indexOf('-',pos);
返回端<0?str.substring(pos):str.substring(pos,end);
}

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

Map 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"));
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#”;
Map 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

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

Map 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"));
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#”;
Map 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

为什么您认为需要正则表达式?这里a#1表示键和值。如果我在“-”上使用split,那么我将得到一个数组,同样,我必须迭代该数组并在“#”上调用split。我想减少循环,这样我就可以立刻得到一个#1,然后调用split()来得到键和值。为什么你认为你需要一个正则表达式?这里a#1表示键和值。如果我在“-”上使用split,那么我将得到一个数组,同样,我必须迭代该数组并在“#”上调用split。我想减少循环,这样我就可以立即得到一个#1,然后调用split()来获得键和值。没关系。如果这解决了您的问题,请接受答案。@shmosel为什么不重要
\\d
只匹配一个数字,对吗?@Kartik我想他是指
input
@shmosel在他对这个问题的评论中,他谈到了键值,所以我认为他指的是数字。。但是OP应该确认这不重要。如果这解决了你的问题,请接受答案。@shmosel为什么不重要
\\d
只匹配一个数字,对吗?@Kartik我想他是指
input
@shmosel在他对这个问题的评论中,他谈到了键值,所以我认为他指的是数字。。但OP应该证实这一点