我试图在文本中找到所有出现的"箭头",所以在
"<----=====><==->>"
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)
不知道为什么.它通常报告"<"
而不是"<===="
或类似.
怎么了?
解
以下程序编译成一个可能的问题解决方案:
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)
说明
星号将匹配前面的零个或多个字符.加号(+
)将匹配前面一个或多个字符.因此<-*
匹配<
而<-+
比赛<-
和任何扩展版本(如<--------
).
当你匹配"<=*|<-*|=*>|-*>"
字符串时"<---"
,它匹配模式的第一部分"<=*"
,因为*
包括零或更多.Java匹配是贪婪的,但它不够聪明,知道还有另一个可能的长匹配,它只是找到匹配的第一个项目.
归档时间: |
|
查看次数: |
720 次 |
最近记录: |