我使用下面的正则表达式来查找我要查找的大多数匹配项,我试图标记任何“ml”后面跟着最多 9 位数字,只要该数字不在 1900-2100 范围内。我遇到的问题是“19750ml”,我甚至不知道在同一个正则表达式中是否可以实现。只要有一个 QUOTE 字符后跟一个 2 位数字,我就不想选择该部分。这个正则表达式匹配“0ml”,因为值 1975 在其前面,但是在这个后跟 2 位数字的单引号中,我希望它标记为“750ml”。换句话说,后跟 2 位数字的 QUOTE 是否可以具有最高优先级?这在 Microsoft SQL 2019 中用作函数。
(?i)(?<!\b(?:19|2[01])\d(?=\d))(?<!\b(?:19|2[01])(?=\d{2}))(?<!\b(?:1(?=9\d{2}))|2(?=[01]\d{2}))(?!\b(?:19|2[01])\d\d)\d{0,9}ml$
以下是一些示例以及上述正则表达式匹配的内容:
玛丽有只小羊羔 1980 750ml
测试 1981 9ml
测试 1982 18ml
测试 2123 456ml
测试 2034 9876ml
测试 2099 12345ml
测试 1999 123456ml
测试987654321ml
测试 '1975 0ml <--- 这家伙是我的问题
测试 1988 ml
测试9999ml
测试 2000 ml
测试100ml
测试 ' 2529ml <--- 我希望它标记为“29ml”,保留引号后跟2个数字
您可以使用以下附加限制来扩展正则表达式:
当匹配以两位数字开始时,匹配不应在引号之后立即开始。
当匹配以数字开始时,匹配不应在引号和数字之后立即开始。
为了在正则表达式中编码这两个约束,我们可以
(?<!'(?=\d\d)|'\d(?=\d))
将其用作对正则表达式中已有约束的附加回顾。我们可以添加这项允许(作为现有规则的例外):
我们可以对其进行编码,
(?<='\d\d)
作为所有其他后视限制的替代。这导致了这个正则表达式:
请参阅regex101