2016-01-09 230 views
0

我试图使用scanner.next(Pattern p)方法来挑选出一个大的文本文件的部分,该文本文件以bob开头并以单词结尾吉姆。例如:Java正则表达式,匹配段落以x开头,以y结尾

hello hello jimbob jimhellohellobob hellojim hellobob 

next()三次,然后返回"jimbob""jimhellohellobob",和"jim hellobob"

但优选不"jimbob jimhellohellobob hellojim hellobob"即它排除在开始和结束之间所允许的文本单词'吉姆。

我很喜欢Regex,更不用说Java正则表达式,所以我没有太多的运气。这是我目前的位置:

String test = "hello hello jimbob jimhellohellobob hellojim hellobob "; 


    Pattern p = Pattern.compile(".*jim.*bob.*"); 
    Scanner s = new Scanner(test); 
    String temp; 

    while(s.hasNext(p)){ 
     temp = s.next(p); 
     System.out.println(temp); 
    } 

这不是打印出来的东西。任何想法,我要去错了吗?

+1

一个单词通常是指由空格分隔的字符序列。在你的例子中'jim'和'bob'不是单词,而是字符序列(即它们不需要在单词边界上,请更新你的问题,用_character sequence_替换单词_word_。 –

回答

3

您正在使用错误的类。要查找所有的事件或正则表达式,您需要使用Matcher及其find方法。由于.*在开始和结束时您的当前正则表达式也接受任何包含的字符串jimbob。另外.*是贪婪的,所以对于像hello jimbob hello bob这样的数据模式jim.*bob*将会匹配jimbob hello bob而不是jimbob部分。要制作.*reluctant,您需要在?之后添加.*?

所以,你的代码应该看起来更像

Pattern p = Pattern.compile("jim.*?bob"); //depending on what you want you may 
              //also need to add word boundary `\\b` 
Matcher m = p.matcher(yourText); 
while(m.find()){ 
    System.out.println(m.group()); 
} 
+0

非常感谢。至少现在给我一些东西,你能解释一下这个符号吗?我仍然有一种情况,jimjimbob正在匹配... –

+0

@DuaneAllman我更新了我的答案,并链接到了关于'。*?'的文章 – Pshemo

+1

@ DuaneAllman也能解释为什么'jimjimbob'是错误的结果吗?你想找到什么?你想找到单个单词的文本片段吗?应该'foo jim bar bob baz'返回任何结果,比如'jim bar bob'或者因为它不包含以'jim'开始并以'bob'结尾的单个单词? – Pshemo

相关问题