Java 使用正则表达式提取特定模式
即使在网上阅读了大量教程之后,我也很难在Java中使用正则表达式。我试图提取接收到的字符串的一部分,以便稍后在我的应用程序中使用 以下是接收到的可能字符串的示例:Java 使用正则表达式提取特定模式,java,regex,Java,Regex,即使在网上阅读了大量教程之后,我也很难在Java中使用正则表达式。我试图提取接收到的字符串的一部分,以便稍后在我的应用程序中使用 以下是接收到的可能字符串的示例: 53248 <CERCLE> 321 211 55 </CERCLE> 57346 <RECTANGLE> 272 99 289 186 </RECTANGLE> 问题是,当我运行代码时,出于某种原因,我所有的匹配器组都处于-1(我想是找不到的)。我已经为此绞尽脑汁一段时间了,欢迎提出
53248 <CERCLE> 321 211 55 </CERCLE>
57346 <RECTANGLE> 272 99 289 186 </RECTANGLE>
问题是,当我运行代码时,出于某种原因,我所有的匹配器组都处于-1(我想是找不到的)。我已经为此绞尽脑汁一段时间了,欢迎提出任何建议:)谢谢。只需使用
String#split()
输出:
53248, CERCLE, 321 211 55
您只需要告诉匹配器开始将模式与输入字符串进行匹配。这对我来说适用于: 该方法成功后,将让匹配器产生您想要的信息。从javadocs: 如果匹配成功,则可以通过start、end和group方法获得更多信息 说了一些类似的指示性的话,强调我的: 返回给定组在上一次匹配操作中捕获的输入子序列
正如@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());
}
final String PATTERN=“(\\d+\\s*\\s*([\\d\\s]+)\\s*”;
字符串s=“53248 321 211 55”;
Pattern=Pattern.compile(Pattern);
匹配器匹配器=模式匹配器;
if(matcher.find()){
系统输出println(匹配器组(1));
系统输出println(匹配器组(2));
System.out.println(matcher.group(3.trim());
}
一些改进:
- 在模式中,您可以将
简化为((\\d+\\s*)+)
。就你而言,它是等效的([\\d\\s]+)
- 在模式中,您可能希望将
与结束
匹配,而不是
。您可以使用
,这是对第二个捕获组的反向引用\\2
- 您可以通过
的结果判断是否匹配了任何内容matcher.find()
matcher.find()
。不久前我遇到了一个类似的问题:更具体地说,要么是matcher.find()
,matcher.matches()
,matcher.lookingAt()
。看看javadoc。哇,太棒了!我会注意到这一点。将来使用matcher时find()看起来有效=),但我是在上大学时这样做的,要求使用正则表达式拆分字符串。您对split()
方法中使用的\\s\\s
有何看法?不是正则表达式吗?添加条件确实是个好主意。然而,我相信它在某种程度上是无用的方法抛出(错误将在其他地方处理)至于数字,我这样做的另一种方法,有点修剪在同一时间。对于(inti=0;i String str="53248 <CERCLE> 321 211 55 </CERCLE>";
String[] array=str.split("(\\s<|>\\s)");
// simple regex (space < OR > space)
String str = "53248 <CERCLE> 321 211 55 </CERCLE>";
String[] array = str.split("(\\s<|>\\s)");
int noSeq = Integer.valueOf(array[0]);
String type = array[1];
String strCoords = array[2];
System.out.println(noSeq+", "+type+", "+strCoords);
53248, CERCLE, 321 211 55
String s = "53248 <CERCLE> 321 211 55 </CERCLE>";
String PATTERN = "(\\d+)\\s*<(\\w+)>\\s*((\\d+\\s*)+)\\s*</\\w*>.*";
Pattern pattern = Pattern.compile(PATTERN);
Matcher matcher = pattern.matcher(s);
matcher.find(); // aye, there's the rub
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));
53248
CERCLE
321 211 55
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());
}