我试图在文本中找到所有出现的“箭头”,所以在
中"<----=====><==->>"
箭头是:
"<----", "=====>", "<==", "->", ">"
这有效:
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());
}
不知道为什么。它通常会报告"<"
而不是"<===="
或类似的。
有什么问题?
答案 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; =”,它会被打破。