如何从String in Java中获取括号中的值并将其与括号前的值匹配?

How to get values in parentheses and match it to the value before parentheses from String in Java?

我有一个很长的字符串,其中包含此人的全名,括号中包含此人的技能。但是,在某些情况下,同一个人有两种技能。

例如:

John Adams (Backend developer)
Bob Scott (Frontend developer) (UI/UX designer)
Alex Walker (Network engineer)
Steve Douglas (Backend developer) (Software design)
John Adams (IT coordinator)

我得到的字符串如下:

"John Adams (Backend developer) Bob Scott (Frontend developer) (UI/UX designer) Alex Walker (Network engineer) Steve Douglas (Backend developer) (Software design) John Adams (IT coordinator)"

我的问题是,如何让每个人都拥有匹配的技能?以及使用什么类型的数据结构?

我的程序在Java.

编辑:

到目前为止我做了什么:

我解决了每个人只有一个职称的问题。 比方说:

String data = "John Adams (Backend developer) Alex Walker (Network engineer)";

通过使用以下正则表达式提取人名,returns 括号内的所有内容:

 \((.*?)\)

然后使用该正则表达式拆分字符串,我得到了列表中每个人的名字。

String regx = " \((.*?)\)";
List<String> names = Arrays.stream(data.split(regx)).toList();

然后我通过以下方式在单独的列表中获取职位名称:

List<String> roles = new ArrayList<>();
Matcher matcher = Patter.compile("\((.*?)\)").mathcer(data);
while(mathcer.find()) {
    roles.add(mathcer.group);
}

完成上述所有操作后,我遇到以下情况:

names = {
0: "John Adams"
1: " Alex Walker"
}

roles = {
0: "(Backend developer)"
1: "(Network engineer)"
}

之后我会根据每个列表中相应的索引来基本匹配人和技能。

但是,当一个人拥有多种技能时,情况就不一样了。

假设:

String data = "John Adams (Backend developer) Bob Scott (Frontend developer) (UI/UX designer) Alex Walker (Network engineer) "

通过应用上述方法,我最终遇到了这种情况:

names = {
0: "John Adams"
1: " Bob Scott"
2: ""
3: " Alex Walker"
}
roles = {
0: "(Backend developer)"
1: "(Frontend developer)"
2: "(UI/UX designer)"
3: "(Network engineer)"
}

在这种情况下,我无法使用匹配索引来匹配人员和技能。

这是一个 one-liner,它为每个人及其技能创建 Map<String, List<String>>

Map<String, List<String>> skills = Pattern.compile("(.*?) \((.*?)\)(?! \() ?")
  .matcher(data)    // a Matcher object for the input
  .results()        // stream all MatchResults
  .collect(toMap(mr -> mr.group(1), mr -> Arrays.asList(mr.group(2).split("\) \("))));

参见 live java demo

这会将 (.*?) \((.*?)\)(?! \() ? 的所有匹配项(匹配名称作为第 1 组和技能作为第 2 组)流式传输到使用名称(第 1 组)作为键并转换的收集器通过 ") (".

的拆分将技能提高到 List<String>

另请参阅 name-skills 配对的 live regex demo