用java的正则表达式找到一个子字符串

问题描述:

我需要在句子“Hello,call me XXX。”中找到一个子字符串。这句话可能很长,唯一能帮助我确定名字的是,名字总是在fromat "call me"+space+name"+dot。不过这句话也可以像hello, call me. call me xxx.用java的正则表达式找到一个子字符串

Call me John. ⇒ John 

Call me Call me John. ⇒ prohibited - confusing 

Call me. Call me John. ⇒ John 

Call me Call me John. ⇒ John 

Call me Peter .Call me John. ⇒ John 

Call me Peter. Call me John. ⇒ prohibited - more then one name... 

名称可以是除\ r,\ n,\ 0,点字符的任意序列。

我将不胜感激如果有人能帮我定义正则表达式。 我试图找出了两个多小时,但没有任何成功...

+3

第2个和第4个句子是一样的,你期望不同的输出。歧义! – Juvanis 2013-02-15 13:17:36

+0

这只是因为在这里stackoverflow格式不好...在第四句话应该有第一个“打电话给我”后两个空格...但是啊...我的坏..我应该写它以某种方式使其更清晰:) – Dworza 2013-02-15 13:20:46

+0

为什么叫我叫我John.'被禁止?根据你的问题陈述,它应该没问题,名字叫'叫我约翰'。另外为什么'叫我彼得。给我约翰。'是不被禁止的?有两个匹配项:名字叫'彼得',名字叫'约翰'。如果名称不能包含空格,“Call me Call me John John”的问题是什么?这不是混淆,名字是'约翰'。 – 2013-02-15 13:20:50

假设名不能包含空格:

String string = "Call me Peter .Call me John."; 
Matcher matcher = Pattern.compile ("Call me ([^\r\n\0\\. ]+)\\.").matcher (string); 
if (matcher.find()) 
{ 
    String name = matcher.group (1); 
    if (matcher.find()) throw new Exception ("Prohibited: too many matches!"); 
    System.out.println (name); 
} 
else throw new Exception ("Prohibited: no matches!"); 

正则表达式应该为你工作:

"(?<=call me)[^.]*" 
+0

耶!你是我的英雄! :) – Dworza 2013-02-15 13:27:57

出头这样的: .*Call\ me\ (.[\w]+).?

检查它是否fullfils您的所有要求上线:http://www.rubular.com/