2012-08-29 91 views
8

我有我的正则表达式/'(.*)(?:(?:'\s*,\s*)|(?:'\)))/
和我的测试代码('He said, "You're cool."' , 'Rawr')
(我的测试代码会模拟参数传递给函数。)

我会解释我的正则表达式按照我的理解,希望你们几个可以阐明我的问题。

1)/'意味着在匹配字符串的开头,需要有'

2)(.*)装置捕获的任何字符以外\n 0次或多次

3)(?:(?:4)|(?:5))装置不捕获但尽量执行步骤4,如果它不工作,尝试第5步

4)(?:'\s*,\s*)手段不捕获,但需要有一个' 0或多个空格字符,随后是,有0个或多个空白字符

5)(?:'\))手段不捕获,但需要有')

如此看来,它应该返回这个(这就是我想要的):
' + He said, "You're cool." + ' ,
但它返回:
' + He said, "You're cool."' , 'Rawr + ')

如果我改变我的测试代码('He said, "You're cool."' , 'Rawr'(没有结束括号),它返回我想要的东西,但只要我补充一点,最后一个小括号,然后好像是我的OR操作为所欲为就是了。如果有逗号,我希望它先测试,如果有逗号,并且如果没有一个括号的检查,那么就打破它。

我试过切换第4步和第5步的点,但OR运算符似乎始终默认为(?:'\))一侧。 我怎样才能匹配尽可能最短的金额?RegExp - 我怎样才能匹配尽可能最短的金额?

+0

字符串的开头将是'/ ^',而不是'/',fwiw。就我个人而言,我不相信我会使用正则表达式来表达你想要做的事情,而是一个小的解析器。令人困惑的正则表达式令人困惑。 –

+0

@DaveNewton - 是的,我知道。这就是为什么我在匹配的字符串开头说的原因。也许我应该在字符串的匹配部分的开始处说。或者当它开始比赛时,它需要以''开始。 – Aust

回答

15

我不认为你的问题是OR运算符,而是greediness.*。它会匹配你的完整字符串,然后返回 -track直到下列表达式匹配。在这个回溯过程中的第一场比赛将是'He said, "You're cool."' , 'Rawr + ')。改为尝试.*?

+1

Bergi你是个天才!这是完美的。 :)你介意解释一下为什么这有效吗?没关系,我从你的链接中了解到。再次感谢。 :) – Aust

+0

您可能想阅读http://stackoverflow.com/a/5319978/1048572 – Bergi