2011-02-28 60 views
0

我理解正则表达式如何搭配文字与没有条件限制它

例如一个问题,我有以下文字:

To ask Jack the Daniels, John the Ripper, whether, they will go out. 

而且我想这部分匹配 - Jack the Daniels, John the Ripper,它结束逗号和后小写字母([AZ])*

当我与此正则表达式匹配它:

'To ask (?P<addressee>[A-Za-z,\s]*), [a-z]' 

我得到以下结果:

Jack the Daniels, John the Ripper, whether 

因此问题是我可以用没有在括号内调理?像这样的事情,但它不是为我工作:

'To ask (?P<addressee>[A-Za-z,\s]*(^, [a-z]*)), [a-z]' 

----编辑

看来,如果我将像这样的东西与之匹配: “(?:\ W [AZ] *) ” 和使用preg_match_all我会得到我想要的东西,但文字可以像下面太:

To ask Jack the Daniels, John the Ripper, whether, they will go out with Joe the Man, or me. 

我将匹配Joe the Man太多,我不想。在条件检查之前是否需要使用([,a-z])?

以下不工作,如何纠正?

'(?<!(, [a-z]))(\W[A-Z].*?),' 
+0

我在这里测试http://www.spaweditor.com/scripts/regex/index.php – llamerr 2011-02-28 11:16:58

+0

你想匹配整个字符串'杰克丹尼尔斯,约翰开膛手'? – hsz 2011-02-28 11:36:47

+0

是的,从“要问”直到第一个小写字母后面的逗号 – llamerr 2011-02-28 11:40:02

回答

2

尝试用:

'(\W[A-Z].*?),' 

还测试@www.spaweditor.com

- 编辑

随着'\W([A-Z].*?),\W[a-z]'preg_match你将捕获第一个结果。

+0

非常感谢,它的工作。也许你也可以解释为什么它捕获所有文本?我没有看到重复的标记,但是当我增加一个联系人时,它甚至能够抓住“杰克丹尼尔斯,约翰开膛手,约翰开膛手”。或者,例如,杰弗里弗里德尔书中的所有解释?如果是这样,我想我会尽可能地阅读它。 – llamerr 2011-02-28 11:53:01

+1

'\ W [A-Z]' - 匹配以空格和大写字母:'J'开始的文本。然后'。*?'将每个字符与条件匹配(使用条件定义为'?'),如果它找到',\ W [a-z] – hsz 2011-02-28 12:56:59