RegExp - 我怎样才能匹配最短的金额? [复制]
Posted
技术标签:
【中文标题】RegExp - 我怎样才能匹配最短的金额? [复制]【英文标题】:RegExp - How can I match the shortest amount possible? [duplicate] 【发布时间】:2012-08-24 07:26:09 【问题描述】:我有我的正则表达式/'(.*)(?:(?:'\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 运算符似乎始终默认为 (?:'\))
端。
如何匹配最短的金额?
【问题讨论】:
字符串的开头是/^
,而不是/
,fwiw。就我个人而言,我不相信我会使用正则表达式来完成你想要做的事情,而是使用一个小型解析器。令人困惑的正则表达式令人困惑。
@DaveNewton - 是的,我知道。这就是为什么我在匹配字符串的开头说的原因。也许我应该在字符串匹配部分的开头说。或者当它开始比赛时,它需要以 '
开头。
【参考方案1】:
我认为您的问题不是 OR 运算符,而是.*
的greediness。它将匹配您的完整字符串,然后 back-track 直到以下表达式匹配。此回溯过程中的第一个匹配项将是'He said, "You're cool."' , 'Rawr
+')
。试试.*?
吧!
【讨论】:
以上是关于RegExp - 我怎样才能匹配最短的金额? [复制]的主要内容,如果未能解决你的问题,请参考以下文章