gpt4 book ai didi

regex - 如何在 Java 中使用正则表达式从定界字符串中仅提取特定类型的值

转载 作者:行者123 更新时间:2023-12-04 12:41:10 25 4
gpt4 key购买 nike

我有一个如下的字符串:

SOMETEXT(ABC, DEF, 5, 78.0, MNO)

我想使用正则表达式解析它以获得 List<String> ABC、DEF 和 MNO。 IE。我想避免使用任何类型的数字,只提取文本。

总的来说,我的结构如下:

class Detail {
String name;
String type;
}

// Sample values of name = "test1" type = "SOMETEXT(ABC,5)"
// Sample values of name = "test2" type = "SOMETEXT(ABC,DEF,2.2)"
// Sample values of name = "test3" type = "SOMETEXT(ABC,DEF)"

来自List<Detail>我想得到 Map<String, List<String>>其中 list<String>是从类型中提取的文本,键是 name ,如果可能,以 Java 8 方式使用流。

到现在为止,我只需要从字符串中获取第一个文本,我是这样做的,如下所示:

Map<String, List<String>> assignOperatorMap = details
.stream()
.collect(groupingBy(md -> md.getName(), mapping((Details m) ->
m.getType().substring(m.getType().indexOf("(") + 1,
m.getType().indexOf(")")).split("\\,")[0] ,
Collectors.toList()
)));

上面的代码给了我: {test1=[ABC], test2=[ABC], test3=[ABC]}那只是第一个值。

最佳答案

这个怎么样:

List<Detail> details = new ArrayList<>();
details.add(new Detail("test1", "SOMETEXT(ABC,5)"));
details.add(new Detail("test2", "SOMETEXT(ABC,DEF,2.2)"));
details.add(new Detail("test3", "SOMETEXT(ABC,DEF)"));

Map<String, List<String>> assignOperatorMap = details.stream()
.flatMap(d -> Arrays.stream(d.getType()
.replaceAll("\\w+\\((.*)\\)", "$1")
.split(","))
.filter(s -> s.matches("[A-Za-z_]+"))
.map(s -> new SimpleEntry<>(d.getName(), s)))
.collect(groupingBy(Entry::getKey, mapping(Entry::getValue, toList())));

System.out.println(assignOperatorMap); // {test2=[ABC, DEF], test3=[ABC, DEF], test1=[ABC]}

想法是首先捕获括号之间的字符串:.replaceAll("\\w+\\((.*)\\)", "$1") , 然后将其拆分为 ,并过滤掉不匹配的 [A-Za-z_]+ .

还有一个创建一堆 Entry<String, String> 的技巧(名称,类型),以避免流式传输两次,因为每个 Detail现在可以生成多种类型的字符串,我们必须以某种方式将它们扁平化List<String> (而不是 List<String[]> )。 (最好使用 Java 9 的 flatMapping 收集器来完成,但现在还没有)。


how can i extend this regex to ignore some texts for example HOURS, MINUTES

您可以创建一个 Set<String>使用您想忽略的词,并在一秒钟内根据该词进行过滤 filter调用:

Set<String> ignore = new HashSet<>();
ignore.add("HOURS");
ignore.add("MINUTES");

...
.filter(s -> s.matches("[A-Za-z_]+"))
.filter(s -> !ignore.contains(s)) // <-- extra filter call
.map(s -> new SimpleEntry<>(d.getName(), s)))
...

关于regex - 如何在 Java 中使用正则表达式从定界字符串中仅提取特定类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44155751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com