Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中从列表中提取子字符串_Java_Regex_String_Substring - Fatal编程技术网

在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池可用”;