在Java中从列表中提取子字符串
如果我有一个父字符串(我们称之为在Java中从列表中提取子字符串,java,regex,string,substring,Java,Regex,String,Substring,如果我有一个父字符串(我们称之为output),它包含一个变量赋值列表,如下所示 status.availability-state available status.enabled-state enabled status.status-reason The pool is available 我想在给定变量名的情况下提取该列表中每个变量的值,即status.availability state、status.enabled state和status.status reason后面空格后的子
output
),它包含一个变量赋值列表,如下所示
status.availability-state available
status.enabled-state enabled
status.status-reason The pool is available
我想在给定变量名的情况下提取该列表中每个变量的值,即status.availability state
、status.enabled state
和status.status reason
后面空格后的子字符串,这样我就得到了三个不同的变量赋值,使得下面的字符串比较都是真的
String availability = output.substring(TODO);
String enabled = output.substring(TODO);
String reason = output.substring(TODO);
availability.equals("available");
enabled.equals("enabled");
reason.equals("The pool is available");
最简单的方法是什么?我应该使用
子字符串吗?这有点棘手,因为您需要将值分配给特定的变量-在Java中,您不能只拥有一个键到变量的映射
我会考虑用开关来做这件事:
for (String line : output.split('\n')) {
String[] frags = line.split(' ', 2); // Split the line in 2 at the space.
switch (frags[0]) { // This is the "key" of the variable.
case "status.availability-state":
availability = frags[1]; // This assigns the "value" to the relevant variable.
break;
case "status.enabled-state":
enabled = frags[1];
break;
// ... etc
}
}
它不是很漂亮,但是您没有太多的选项。这有点棘手,因为您需要将值分配给特定的变量-您不能只拥有Java中变量的键映射
我会考虑用开关来做这件事:
for (String line : output.split('\n')) {
String[] frags = line.split(' ', 2); // Split the line in 2 at the space.
switch (frags[0]) { // This is the "key" of the variable.
case "status.availability-state":
availability = frags[1]; // This assigns the "value" to the relevant variable.
break;
case "status.enabled-state":
enabled = frags[1];
break;
// ... etc
}
}
它不是很漂亮,但您没有太多的选项。此循环将匹配并提取变量,然后您可以根据需要分配它们:
Pattern regex = Pattern.compile("status\\.(.*?)-.*? ([a-z]+)");
Matcher matcher = regex.matcher(output);
while (matcher.find()) {
System.out.println(matcher.group(1) + "=" + matcher.group(2));
}
status\\.
匹配“status”
(.*)
匹配任何字符序列,但不贪婪,并捕获它们
-.*
匹配破折号、任何字符和空格
([a-z]+)
匹配任何小写字母字符串并捕获它们此循环将匹配并提取变量,然后您可以根据需要分配它们:
Pattern regex = Pattern.compile("status\\.(.*?)-.*? ([a-z]+)");
Matcher matcher = regex.matcher(output);
while (matcher.find()) {
System.out.println(matcher.group(1) + "=" + matcher.group(2));
}
status\\.
匹配“status”
(.*)
匹配任何字符序列,但不贪婪,并捕获它们
-.*
匹配破折号、任何字符和空格
([a-z]+)
匹配任何小写字母字符串,并捕获它们这里似乎有两个问题——如何解析字符串,以及如何按名称分配变量
一步一步地处理字符串解析:
- 首先编写一个程序,一次读取一行,并在循环体中输出每一行
String.split()
或StringTokenizer
是这里的两个选项
- 接下来,编写一个处理一行的方法来增强这一点。同样的工具在这里也很有用,可以在空间上拆分
- 您现在应该有一个程序,可以为每行输入打印
name:status.availability-state,value:available
接下来,您将要求根据参数的名称以编程方式为变量赋值
在运行时没有合法的方法来查看变量的名称(好的,Java8反射是有方法的,但是如果没有很好的理由,就不应该使用它)
因此,最好使用开关
或if
语句:
switch(name) {
case status.availability-state:
availability = value;
break;
... etc.
}
但是,无论何时使用开关
或if
,都应该考虑是否有更好的方法
有什么原因不能将这些变量转换为Map
条目吗
configMap.add(name,value);
然后阅读:
doSomethingWith(configMap.get("status.availability");
这就是地图的用途。使用它们
这种情况与新手错误使用名为person1
,person2
,person3
的变量类似。。。而不是使用数组。最终,他们会问“如何从数字25到变量person25”————答案是,你不能,但数组或列表让它变得简单people[number]
或people.get(number)
这里似乎有两个问题——如何解析字符串,以及如何按名称分配变量
一步一步地处理字符串解析:
- 首先编写一个程序,一次读取一行,并在循环体中输出每一行
String.split()
或StringTokenizer
是这里的两个选项
- 接下来,编写一个处理一行的方法来增强这一点。同样的工具在这里也很有用,可以在空间上拆分
- 您现在应该有一个程序,可以为每行输入打印
name:status.availability-state,value:available
接下来,您将要求根据参数的名称以编程方式为变量赋值
在运行时没有合法的方法来查看变量的名称(好的,Java8反射是有方法的,但是如果没有很好的理由,就不应该使用它)
因此,最好使用开关
或if
语句:
switch(name) {
case status.availability-state:
availability = value;
break;
... etc.
}
但是,无论何时使用开关
或if
,都应该考虑是否有更好的方法
有什么原因不能将这些变量转换为Map
条目吗
configMap.add(name,value);
然后阅读:
doSomethingWith(configMap.get("status.availability");
这就是地图的用途。使用它们
这种情况与新手错误使用名为person1
,person2
,person3
的变量类似。。。而不是使用数组。最终,他们会问“如何从数字25到变量person25”————答案是,你不能,但数组或列表让它变得简单people[number]
或people.get(number)
一个有效的替代方法是将字符串按\n
拆分并添加到映射中。例如:
String properties = "status.availability-state available\nstatus.enabled-state enabled\nstatus.status-reason The pool is available";
Map<String, String> map = Arrays.stream(properties.split("\n"))
.collect(Collectors.toMap(s -> s.split(" ")[0], s -> s.split(" ", 2)[1]));
System.out.println(map.get("status.status-reason"));
String properties=“status.availability-state available\nstatus.enabled-state enabled\nstatus.status-reason池可用”;
Map Map=Arrays.stream(properties.split(“\n”))
.collect(收集器.toMap(s->s.split(“”[0],s->s.split(“”,2)[1]);
System.out.println(map.get(“status.status-reason”);
如果输出池可用
一个有效的替代方法是将字符串按\n
拆分并添加到映射中。例如:
String properties = "status.availability-state available\nstatus.enabled-state enabled\nstatus.status-reason The pool is available";
Map<String, String> map = Arrays.stream(properties.split("\n"))
.collect(Collectors.toMap(s -> s.split(" ")[0], s -> s.split(" ", 2)[1]));
System.out.println(map.get("status.status-reason"));
String properties=“status.availability-state available\nstatus.enabled-state enabled\nstatus.status-reason池可用”;