java使用正则表达式提取特定模式
即使在网上阅读了大量教程之后,我也很难在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(我想是找不到)。我已经为此绞尽脑汁好一阵子了,欢迎提出任何建议:)谢谢
# 1 楼答案
正如@2rs2ts指出的,问题在于缺少
matcher.find()
调用我想进一步改进如下:
一些改进:
((\\d+\\s*)+)
简化为([\\d\\s]+)
。就你而言,这是等效的李><CERCLE>
与结束</CERCLE>
匹配,而不是</OTHER>
。您可以使用\\2
实现这一点,这是对第二个捕获组的反向引用李>matcher.find()
的结果来判断是否有匹配的内容李># 2 楼答案
您只需要告诉匹配器开始将模式与输入字符串匹配。这在ideone上对我有效:
产出为:
^{} 方法成功后,将让匹配器生成所需的信息。从javadocs:
^{} 说了一些类似的指示,强调我的:
# 3 楼答案
只需尝试一下
String#split()
注意:如果还有一个或多个空格,请尝试使用
\\s+
在本例中,使用数组的前三个值
53248, CERCLE, 321 211 55
完整代码:
输出: