regex - 正则表达式匹配分数而不是日期

标签 regex

我正在尝试提出一个正则表达式,该表达式将匹配字符串中的分数 (1/2) 但不匹配日期 (5/5/2005)。任何帮助都会很棒,我能想到的是 (\d+)/(\d+) 可以在两个字符串中找到匹配项。在此先感谢您的帮助。

最佳答案

假设 PCRE,使用负前瞻和后视:

(?<![\/\d])(\d+)\/(\d+)(?![\/\d])

前瞻((?=) 组)说“如果后面跟着其他东西,就匹配这个东西。”前瞻的内容不匹配。我们否定它((?!) 组)以便它
不匹配我们的分数之后的东西 - 这样,我们不匹配接下来的组。

前瞻的补充是后视((?<=) 组)做相反的事情 - 如果它前面是其他东西,它匹配其他东西,就像前瞻一样,我们可以否定它((?<!) 组),这样我们可以匹配不遵循某物的事物。

它们一起确保我们的分数在它之前或之后没有分数的其他部分。它对输入数据没有其他任意要求。它将匹配分数 2/3在字符串中 "te2/3xt" ,与提供的大多数其他示例不同。

如果您的正则表达式风格使用 // s 来分隔正则表达式,你必须在其中转义斜杠,或者使用不同的分隔符(Perl 的 m{} 在这里是一个不错的选择)。

编辑:显然,这些正则表达式都不起作用,因为正则表达式引擎正在回溯并匹配更少的数字以满足正则表达式的要求。当我一直在研究一个正则表达式这么长时间时,我坐下来决定也许一个巨大的正则表达式不是答案,我编写了一个使用正则表达式和其他一些工具来为我做的函数。你说过你在使用 Ruby。这对我有用:
>> def get_fraction(s)
>>   if s =~ /(\d+)\/(\d+)(\/\d+)?/
>>     if $3 == nil
>>       return $1, $2
>>     end
>>   end
>>   return nil
>> end
=> nil
>> get_fraction("1/2")
=> ["1", "2"]
>> get_fraction("1/2/3")
=> nil

此函数返回分数的两部分,但返回 nil如果它是一个日期(或者如果没有分数)。 "1/2/3 and 4/5" 失败但我不知道你是否希望(或需要)通过。无论如何,我建议将来当您在 Stack Overflow 上询问“我如何制作正则表达式来匹配它?”你应该先退后一步,看看你是否可以使用正则表达式和一些额外的东西来做到这一点。正则表达式是一个很好的工具,可以做很多事情,但它们并不总是需要单独使用。

编辑2:

我想出了如何在不求助于非正则表达式代码的情况下解决问题,并更新了正则表达式。它现在应该可以按预期工作,但我还没有测试过。我也继续前进并逃脱了/因为无论如何你都必须这样做。

编辑 3:

我刚刚修复了 j_random_hacker 在我的前瞻和后视中指出的错误。我继续看到在这个正则表达式中付出的努力证明纯正则表达式解决方案不一定是这个问题的最佳解决方案。

关于regex - 正则表达式匹配分数而不是日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1912376/

相关文章:

regex - 关于 "or"和 "asterisk"的决定

regex - BigQuery REGEXP_EXTRACT 返回 null

javascript - 是否有匹配单个字素簇的正则表达式?

php - 用于匹配字符串中可疑单词的正则表达式

正则表达式使所有字符都位于第一个空格的右侧?

python - 使用 Python 正则表达式查找两个变量之间的 HTML

regex - 查找重复标记的子字符串

regex - PostgreSQL 正则表达式检查以拉丁字符和字母字符开头

php - 在 .htaccess 中重写规则 - 波斯语的正则表达式

java - 从文本中提取特定单词