在文本中查找ASCII"箭头"

ulv*_*ver 4 java regex

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

"<----=====><==->>"
Run Code Online (Sandbox Code Playgroud)

箭头是:

"<----", "=====>", "<==", "->", ">"
Run Code Online (Sandbox Code Playgroud)

这有效:

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

但这不是:

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

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

怎么了?

Dav*_*vis 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());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

运行#1:

$ java A "<----=====><<---<==->>==>"
<----
=====>
<
<---
<==
->
>
==>
Run Code Online (Sandbox Code Playgroud)

运行#2:

$ java A "<----=====><=><---<==->>==>"
<----
=====>
<=
>
<---
<==
->
>
==>
Run Code Online (Sandbox Code Playgroud)

说明

星号将匹配前面的零个或多个字符.加号(+)将匹配前面一个或多个字符.因此<-*匹配<<-+比赛<-和任何扩展版本(如<--------).

  • 更准确地说正则表达式**量词**是贪婪的(默认情况下).交替不是; 它按照它们编写的顺序检查每个替代方案,并与第一个有效的方法一起使用. (4认同)

Kev*_*son 6

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