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