【发布时间】:2018-04-22 12:33:01
【问题描述】:
[编辑] 注意:
最短的正则表达式是主要问题,而不是反向引用。
要求:
使用最短的正则表达式匹配以下格式的所有字符串:
<two digits><connect char><three digits><connect char><four digits>
为了便于阅读:
<two digits>
<connect char>
<three digits>
<connect char>
<four digits>
条件:
- 匹配整个字符串,假设输入字符串是单行。
- Connect char 可以省略,也可以是
[-./ ]中的任何一个(不包括[])。 - 每个匹配字符串中的两个连接字符必须相同。
- 最短很重要,性能不重要。
示例
一些有效的字符串:
55.635.8828
72/683/1582
86 942 7682
581827998 // Both connect chars is omit
一些无效的字符串:
56.855/9856 // Two connect chars are different.
56 4559428 // Same as above
这个简短的正则表达式将匹配所有有效的字符串:
^\d{2}[-./ ]?\d{3}[-./ ]?\d{4}$
但它也匹配无效的:
52-355/9984
这个正则表达式将匹配所有正确的字符串,但很长。我把它分成多行以便于阅读:
^(\d{2}-?\d{3}-?\d{4})|
(\d{2}\.?\d{3}\.?\d{4})|
(\d{2}/?\d{3}/?\d{4})|
(\d{2} ?\d{3} ?\d{4})$
你能给我推荐一个符合要求的更短的正则表达式吗?
【问题讨论】:
-
\A\d{2}([-./ ]?)\d{3}\1\d{4}\z -
@Rawing:我还要求最短的正则表达式。
标签: c# regex string-matching