当前位置: 代码迷 >> J2SE >> thinking in java中的一个例子,小弟我稍微改了一下,就死循环了,指导下
  详细解决方案

thinking in java中的一个例子,小弟我稍微改了一下,就死循环了,指导下

热度:51   发布时间:2016-04-23 20:39:44.0
thinking in java中的一个例子,我稍微改了一下,就死循环了,指导下!
package Chapter13_String;

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

public class StartEnd {
public static String str=
"As long as there is injustice,whenever a\n"+
"baby cires out, wherever a distress\n"+
"signal sounds among the starts ... We all be there.\n"+
"This fine ship, and this fine crew ..."+
"Never give up, Never surrender!";
public static void examine(String s,String regex){
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(s);
System.out.println(regex);
while(m.find()){
//当在匹配中查找到相应的匹配时==一次查找,可以进行多次匹配操作
System.out.println("find() '"+m.group()+"' start="+m.start()+",end="+m.end());
if(m.lookingAt()){
System.out.println("lookingAt() '"+m.group()+"' start="+m.start()+",end="+m.end());
}
if(m.matches()){
System.out.println("matches() '"+m.matches()+"' start="+m.start()+",end="+m.matches());
}
}
}
public static void main(String[] args){
for(String element:str.split("\n")){
System.out.println("input: "+element);
for(String secondElement:new String[]{"\\w*ere\\w*","\\w*ere","T\\w+","Never.*?!"}){
examine(element,secondElement);
}
}
}
}

死循环
input: As long as there is injustice,whenever a
find() 'there' start=11,end=16
find() 'there' start=11,end=16
find() 'there' start=11,end=16
find() 'there' start=11,end=16
find() 'there' start=11,end=16
......

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

预定义字符类 
. 任何字符(与行结束符可能匹配也可能不匹配) 
\d 数字:[0-9] 
\D 非数字: [^0-9] 
\s 空白字符:[ \t\n\x0B\f\r] 
\S 非空白字符:[^\s] 
\w 单词字符:[a-zA-Z_0-9] 
\W 非单词字符:[^\w] 


Greedy 数量词 
X? X,一次或一次也没有 
X* X,零次或多次 
X+ X,一次或多次 
X{n} X,恰好 n 次 
X{n,} X,至少 n 次 
X{n,m} X,至少 n 次,但是不超过 m 次 
  
Reluctant 数量词 
X?? X,一次或一次也没有 
X*? X,零次或多次 
X+? X,一次或多次 
X{n}? X,恰好 n 次 
X{n,}? X,至少 n 次 
X{n,m}? X,至少 n 次,但是不超过 m 次 
\w 是词字符,

引用:

....
for(String secondElement:new String[]{"\\were\\w","\\were","T\\w+","Never.*?!"}){
              examine(element,secondElement);
 }
.....


input: As long as there is injustice,whenever a
\were\w
\were
find() 'here' start=12,end=16
T\w+
Never.*?!
input: baby cires out, wherever a distress
\were\w
find() 'herev' start=17,end=22
\were
find() 'here' start=17,end=21
T\w+
Never.*?!
input: signal sounds among the starts ... We all be there.
\were\w
\were
find() 'here' start=46,end=50
T\w+
Never.*?!
input: This fine ship, and this fine crew ...Never give up, Never surrender!
\were\w
\were
T\w+
find() 'This' start=0,end=4
lookingAt() 'This' start=0,end=4
Never.*?!
find() 'Never give up, Never surrender!' start=38,end=69

奇怪,为什么改个正则,就不死循环了,,,\\w*ere\\w*我这个意思是“词字符(0-多个)+ere+词字符(0-多个)”,虽然你对了,但是我这种业务逻辑怎么操作呢?


你可以使用点 . 试试
.是任意字符,他会把一切都包含进去,怎么破。而你的正则没有表达出我的业务逻辑啊?



你原先的写法没有问题,问题出在这里:

if(m.lookingAt()){
                System.out.println("lookingAt() '"+m.group()+"' start="+m.start()+",end="+m.end());
            }
            if(m.matches()){
                System.out.println("matches() '"+m.matches()+"' start="+m.start()+",end="+m.matches());
            }

你把它注释掉看看
------解决方案--------------------
比如字符串实例:“As long as there is injustice,whenever a”
正则表达式:"\\w*ere\\w*"
执行:
while(m.find()){
           //打印m.group();
            if(m.lookingAt()){
  相关解决方案