请问一下这种情况下该如何用 Java 写对应的正则表达式捕获我想要的?

2020-04-09 12:44:17 +08:00
 Newyorkcity
String message = "dadfagdagfghh[file=sldfkjal.jpg,url=dalfkjkt.com][file=dlafjklt.png,url=aaeiotub]"

我期待能够得到一个数组,其中包含所有 [] 中的 file 对应的值,在上面这个例子中,我期望得到的结果为: [ "sldfkjal.jpg", "dlafjklt.png" ]

上面这个例子里看着明显无意义的地方,比如 dadfagdagfghh 这种,就表示这块内容无法事先规定好,各种情况都有可能。同时 [] 这个会有多少个也无法事先规定好。

        Pattern regex = Pattern.compile("file=(.*),url");
        Matcher matcher = regex.matcher(message);
        if(matcher.find()){
            System.out.println(matcher.group(1));
            System.out.println(matcher.group(1));
        }

我自己现在是这么处理的。。。但是很遗憾两次 group(1) 的结果都是同一个值。。

谢谢解答

787 次点击
所在节点    问与答
4 条回复
raymanr
2020-04-09 12:52:04 +08:00
file=(.*?),url
nortonlai
2020-04-09 13:16:45 +08:00
一次 find 只能捕获一个,你需要把 if 改成 while
nortonlai
2020-04-09 13:20:39 +08:00
//贴一个将 xml 文本里面的字段存入 map 的正则表达式使用例子 这里的 xml 并没有多级结构,也没有多余的属性

Pattern p=Pattern.compile("<(?<node>[0-9A-Za-z_]{2,50}?)>(?<val>.*?)<[/](?:[0-9A-Z_a-z]{2,50})>");
Matcher matcher = p.matcher(xml);
while (matcher.find()) {
String key = matcher.group("node");
String val = matcher.group("val");
result.put(key.trim(), val.trim());
}
(?: 代表非捕获组 即也是组 但 find 时候忽略
(? 即对 此捕获组取名 为 node
?) 即非贪心的 最小匹配 如果正则没有详细匹配往大了写 如.* 那么最好加上
Newyorkcity
2020-04-09 13:21:55 +08:00
@nortonlai 解决了,if 改 while 就行了,感谢!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/660754

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX