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 - 我怎样才能匹配最短的金额? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式找到最短的重叠匹配?

!!!!!!!1怎样在最短的时间内掌握asp?

图论之最短路径算法

怎样用最短的时间学习一种语言--Go语言北京站 | 北京活动

我怎样才能找到间隔 100 天的金额?

我怎样才能加快这个 Anagram 算法