在文本中查找ASCII“箭头”

时间:2009-07-25 21:09:05

标签: java regex

我试图在文本中找到所有出现的“箭头”,所以在

"<----=====><==->>"

箭头是:

"<----", "=====>", "<==", "->", ">"

这有效:

 String[] patterns = {"<=*", "<-*", "=*>", "-*>"};
    for (String p : patterns) {
      Matcher A = Pattern.compile(p).matcher(s);
       while (A.find()) {
        System.out.println(A.group());
      }         
    }

但这不是:

      String p = "<=*|<-*|=*>|-*>";
      Matcher A = Pattern.compile(p).matcher(s);
       while (A.find()) {
        System.out.println(A.group());
      }         

不知道为什么。它通常会报告"<"而不是"<===="或类似的。

有什么问题?

5 个答案:

答案 0 :(得分:6)

<强>解决方案

以下程序编写了一个可能的问题解决方案:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class A {
  public static void main( String args[] ) {
    String p = "<=+|<-+|=+>|-+>|<|>";
    Matcher m = Pattern.compile(p).matcher(args[0]);
    while (m.find()) {
      System.out.println(m.group());
    }
  }
}

运行#1:

$ java A "<----=====><<---<==->>==>"
<----
=====>
<
<---
<==
->
>
==>

运行#2:

$ java A "<----=====><=><---<==->>==>"
<----
=====>
<=
>
<---
<==
->
>
==>

<强>解释

星号将匹配前面几个或多个字符。加号(+)将匹配前面一个或多个字符。因此,<-*匹配<,而<-+匹配<-和任何扩展版本(例如<--------)。

答案 1 :(得分:6)

当您将"<=*|<-*|=*>|-*>"与字符串"<---"匹配时,它会匹配模式的第一部分"<=*",因为*包含零或更多。 Java匹配是贪婪的,但它不够聪明,知道还有另一个可能更长的匹配,它只是找到匹配的第一个项目。

答案 2 :(得分:1)

您的第一个解决方案将匹配您正在寻找的所有内容,因为您可以将每个模式一次发送到匹配器中,然后他们就有机会单独处理目标字符串。

您的第二次尝试将无法以相同的方式工作,因为您将单个模式与多个表达式进行OR或组合在一起,并且OR'd字符串有优先规则,其中将首先尝试最左边的标记。如果匹配,无论多么匹配,get()都将返回该匹配并从那里继续。

请参阅Thangalin对一个解决方案的回应,该解决方案将使第二个工作像第一个一样。

答案 3 :(得分:0)

for&lt; =======你需要&lt; = +作为正则表达式。 &lt; = *将匹配零或更多='s,这意味着它将始终匹配零情况,因此&lt;。你遇到的其他情况也一样。你应该读一下正则表达式。这本书非常棒: Mastering Regular Expressions

答案 4 :(得分:0)

您提供的正则表达式模式字符串适用于您的示例:“&lt; ---- =====&gt;&lt; == - &gt;&gt;”

 String p = "<=*|<-*|=*>|-*>";
 Matcher A = Pattern.compile(p).matcher(s);
   while (A.find()) {
           System.out.println(A.group());
                   }

然而,对于答案中指出的其他一些例子,例如输入字符串“&lt; - ”会产生“&lt;”,但奇怪的是“&lt; =”会产生“&lt; =”,它会被打破。