1

我有这个正则表达式示例:http ://regexr.com?34hihsvn

我想知道是否有更优雅的编写方式,或者更优化的方式?

以下是规则:

  • 仅限数字和破折号。
  • 不得包含超过 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

我正在使用此站点进行测试: http: //gskinner.com/RegExr/

感谢您的帮助,尼克

4

3 回答 3

1

您的正则表达式只允许最大长度为 5 的第一组和第二组数字。因此,像1-12345678-1or这样的有效字符串123456-1-1不会被匹配。

此正则表达式适用于给定的要求:

\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

(正则表达式)

于 2013-04-15T19:07:56.890 回答
1

您可以将其与m修饰符一起使用(打开多行模式)

^\d(?!.{12})\d*-\d+-\d$

或者这个没有m修饰符的:

\b\d(?!.{12})\d*-\d+-\d\b

通过设计,这两种模式至少匹配由连字符分隔的三个数字(因此无需在{5,n}某处放置量词,它没用)。模式也被构建为更快地失败:

  • 我选择以 digit 开头\d,这样,每行开头或字边界后面没有数字的都会立即被丢弃。另一件事,只使用一个数字,我知道剩余的字符串长度。
  • 然后我用负前瞻测试字符串长度的上限,测试是否比最大长度多一个字符(如果这个位置有 12 个字符,则字符串中至少有 13 个字符)。此处无需使用比点元字符更具描述性的内容,目标是快速测试长度。
  • 最后,我描述了字符串的结尾而不做任何特别的事情。这可能是模式中​​较慢的部分,但这并不重要,因为绝大多数不必要的位置已经被丢弃。
于 2013-04-15T19:34:25.710 回答
1

这是我想出的一个正则表达式:

(?=\b[\d-]{3,10}-\d\b)\b\d+-\d+-\d\b

这在尝试匹配之前使用前瞻来验证信息。[\d-]所以它会在adash和 a的类中查找 3-10 个字符digit。然后在这之后你有实际的匹配来确认你的字符串的格式实际上是digit(dash)digit(dash)digit.

从您的示例字符串中,此正则表达式匹配:

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
于 2013-04-15T19:34:25.510 回答