使用 PCRE 正则表达式匹配大多数但不是所有的一到三位数字
Matching most but not all one-to-three digit numbers with a PCRE regular expression
我需要匹配 1、2 或 3 位数字,例如 ([\d]|[\d][\d]|[\d][\d][\d])
。但是我需要两个 3 位特定数字的例外情况,即 350
和 380
。是否可以创建一个正则表达式来实现我的目标?
这很简单:
- 1 到 3 位数字:
\b\d{1,3}\b
(此处需要单词边界 - 否则您可能会匹配较长数字的一部分)
- 350 和 380 除外:
(?!350|380)
或 (?!3[58]0)
如果您喜欢可读性较差的表达式 ;)
合并它们,你会得到:
\b(?!350|380)\d{1,3}\b
你可以用{MIN,MAX}说出1到3个相同的字。这简化了你的正则表达式:
/^\d{1,3}$/
另外,除非你想从像 12345
这样的字符串中匹配 123
,否则你需要在前后添加一些约束,可能不是数字或 space, 逗号等。在上面的 ^
和 $
确保数字全部单独在一行上。
最后,最简单的方法可能是将最终结果与 350 和 380 进行比较,而不是尝试制作复杂的 RE。它将使最终代码更易于阅读和理解。
我需要匹配 1、2 或 3 位数字,例如 ([\d]|[\d][\d]|[\d][\d][\d])
。但是我需要两个 3 位特定数字的例外情况,即 350
和 380
。是否可以创建一个正则表达式来实现我的目标?
这很简单:
- 1 到 3 位数字:
\b\d{1,3}\b
(此处需要单词边界 - 否则您可能会匹配较长数字的一部分) - 350 和 380 除外:
(?!350|380)
或(?!3[58]0)
如果您喜欢可读性较差的表达式 ;)
合并它们,你会得到:
\b(?!350|380)\d{1,3}\b
你可以用{MIN,MAX}说出1到3个相同的字。这简化了你的正则表达式:
/^\d{1,3}$/
另外,除非你想从像 12345
这样的字符串中匹配 123
,否则你需要在前后添加一些约束,可能不是数字或 space, 逗号等。在上面的 ^
和 $
确保数字全部单独在一行上。
最后,最简单的方法可能是将最终结果与 350 和 380 进行比较,而不是尝试制作复杂的 RE。它将使最终代码更易于阅读和理解。