gpt4 book ai didi

java - 使用正则表达式提取特定模式

转载 作者:行者123 更新时间:2023-11-29 05:23:28 25 4
gpt4 key购买 nike

即使在阅读了大量在线教程之后,我仍然很难在 Java 中使用正则表达式。我正在尝试提取接收到的字符串的一部分,以便稍后在我的应用程序中使用。

以下是可能收到的字符串的示例:

53248 <CERCLE> 321 211 55 </CERCLE>
57346 <RECTANGLE> 272 99 289 186 </RECTANGLE>

要提取第一个数字作为序列号。<> 之间的单词也将被提取。然后,中间的数字序列也是如此。

这是我的模式:

"(\\d+)\\s*<(\\w+)>\\s*((\\d+\\s*)+)\\s*</\\w*>.*"

到目前为止,这是我的方法的代码:

public decompose(String s) throws IllegalArgumentException {

Pattern pattern = Pattern.compile(PATTERN);
Matcher matcher = pattern.matcher(s);

noSeq = Integer.parseInt(matcher.group(1));
type = typesFormes.valueOf(matcher.group(2));
strCoords = matcher.group(3).split(" ");

}

问题是,当我运行代码时,出于某种原因,我所有的匹配器组都处于 -1(我猜没有找到)。我已经为此苦苦思索了一段时间,欢迎提出任何建议 :) 谢谢。

最佳答案

正如@2rs2ts 所指出的,问题是缺少 matcher.find()打电话。

我会像这样进一步改进:

final String PATTERN = "(\\d+)\\s*<(\\w+)>\\s*([\\d\\s]+)\\s*</\\2>.*";
String s = "53248 <CERCLE> 321 211 55 </CERCLE>";
Pattern pattern = Pattern.compile(PATTERN);
Matcher matcher = pattern.matcher(s);
if (matcher.find()) {
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3).trim());
}

一些改进:

  • 在模式中,你可以简化((\\d+\\s*)+)作为([\\d\\s]+) .对于您的目的,它是等效的。
  • 在模式中,您可能想要匹配 <CERCLE>结束</CERCLE> , 不是 </OTHER> .您可以使用 \\2 来做到这一点,这是对第二个捕获组的反向引用。
  • 可以通过matcher.find()的结果来判断如果有任何匹配。
  • 在中间拆分数字列表之前,您可能想使用 .trim() 修剪末尾可能的尾随空格。 .

关于java - 使用正则表达式提取特定模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23705179/

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