Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用正则表达式提取特定模式_Java_Regex - Fatal编程技术网

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

Java 使用正则表达式提取特定模式,java,regex,Java,Regex,即使在网上阅读了大量教程之后,我也很难在Java中使用正则表达式。我试图提取接收到的字符串的一部分,以便稍后在我的应用程序中使用 以下是接收到的可能字符串的示例: 53248 <CERCLE> 321 211 55 </CERCLE> 57346 <RECTANGLE> 272 99 289 186 </RECTANGLE> 问题是,当我运行代码时,出于某种原因,我所有的匹配器组都处于-1(我想是找不到的)。我已经为此绞尽脑汁一段时间了,欢迎提出

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

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

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()
    的结果判断是否匹配了任何内容
  • 在将中间的数字列表拆分之前,您可能希望使用<代码> .Times()/<代码>修剪尾部可能的尾随空白。< /LI>
我认为您需要先运行
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());
}