Regex 如何优化此正则表达式以匹配字符串(1234-12345-1)
我有一个正则表达式示例: 我想知道是否有更优雅的写作方式,或者更优化的写作方式 规则如下:Regex 如何优化此正则表达式以匹配字符串(1234-12345-1),regex,validation,number-formatting,Regex,Validation,Number Formatting,我有一个正则表达式示例: 我想知道是否有更优雅的写作方式,或者更优化的写作方式 规则如下: 仅限数字和破折号 不能包含超过10个数字 必须有两个连字符 每个连字符之间必须至少有一个数字 最后一个数字只能是一位数字 我是新手,所以如果有任何提示或提示,我将不胜感激 如果链接过期,则要搜索的文本为 ---------- 22-22-1 22-22-22 333-333-1 333-4444-1 4444-4444-1 4444-55555-1 55555-4444-1 666666-777777
- 仅限数字和破折号
- 不能包含超过10个数字
- 必须有两个连字符
- 每个连字符之间必须至少有一个数字
- 最后一个数字只能是一位数字
----------
22-22-1
22-22-22
333-333-1
333-4444-1
4444-4444-1
4444-55555-1
55555-4444-1
666666-7777777-1
88888888-88888888-1
1-1-1
88888888-88888888-22
22-333-
333-22
----------
我的正则表达式是:\b((\d{1,4}-\d{1,5})|(\d{1,5}-\d{1,4}))-\d{1}\b
我正在使用此网站进行测试:
谢谢你的帮助,
Nick您的regexp只允许第一组和第二组最大长度为5的数字。因此,像
1-12345678-1
或123456-1-1
这样的有效字符串将不匹配
此regexp适用于给定的要求:
\b(?:\d\-\d{1,8}|\d{2}\-\d{1,7}|\d{3}\-\d{1,6}|\d{4}\-\d{1,5}|\d{5}\-\d{1,4}|\d{6}\-\d{1,3}|\d{7}\-\d{1,2}|\d{8}\-\d)\-\d\b
()您可以将其与
m
修改器一起使用(打开多行模式):
或者这个没有m
修饰符:
\b\d(?!.{12})\d*-\d+-\d\b
通过设计,这两种模式至少匹配三个由连字符分隔的数字(因此无需在某处放置{5,n}
量词,这是无用的)。
模式也是为了更快地失败而构建的:
- 我选择了以一个数字开头,这样一来,行或字边界的每一个开头都会立即被丢弃。另一件事,只使用一个数字,我知道剩余的字符串长度
- 然后,我用一个负前瞻测试字符串长度的上限,该测试是否比最大长度多了一个字符(如果这个位置有12个字符,那么字符串中至少有13个字符)。无需使用更具描述性的点元字符,这里的目标是快速测试长度
- 最后,我描述了字符串的结尾,没有做任何特殊的事情。这可能是模式中较慢的部分,但这并不重要,因为绝大多数不必要的位置已经被丢弃
- 这是我想出的一个正则表达式:
(?=\b[\d-]{3,10}-\d\b)\b\d+-\d+-\d\b
这将在尝试匹配之前使用前瞻来验证信息。因此,它在[\d-]
类中查找3-10个字符,后跟破折号和数字。然后进行实际匹配,以确认字符串的格式实际上是数字(破折号)数字(破折号)数字
从您的示例字符串中,此正则表达式匹配:
22-22-1
333-333-1
333-4444-1
4444-4444-1
4444-55555-1
55555-4444-1
1-1-1
它还匹配以下字符串:
22-7777777-1
1-88888888-1
说得好!我忽略了我需要它来匹配22-7777777-1或1-8888888-1。这也匹配22-7777777-1和1-8888888-1,这也是我错过的一个要求。根据你的描述,我希望这是一个要求。我很高兴看到我是正确的。我会用这个更新我的答案。希望这有帮助。好吧,这也行。。。什么是多行模式?这个正则表达式是如何工作的?干杯。好的,我有一个解释
22-7777777-1
1-88888888-1