即使在网上阅读了大量教程之后,我也很难在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。我已经为此努力了一段时间,欢迎提出任何建议:)谢谢。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 正如@ 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/ (adsbygoogle = window.adsbygoogle || []).push({});
10-10 01:20
查看更多