我有一个正则表达式,可以查找某些类型的主机名,例如:.*-.*(nmtg)*|.*(\.nms)
。如何修改它以使其不匹配:11.22:33:44:55-66
?
应匹配:
cs25-admin.nmtg.company.com
cs25-admin
但不应该匹配:
11.22:33:44:55-66
答案 0 :(得分:3)
两种基本方式:
您可以替换"匹配任何内容" .
使用"匹配除冒号以外的任何内容"无处不在[^:]
你可以在前面添加"没有冒号到字符串的末尾" (?!.*:)
编辑正如Signus所说,你的正则表达式实际上是非特定的并且是开放式的;它会比你想象的要多得多。例如,"----THRICEnmtgnmtgnmtg"
是完全匹配,"(-_-)"
也是如此。这是一个更好的策略,更容易仔细指定您想要的内容,而不是列出例外情况。 Signus提出的正则表达是一个很好的例子。
它们仍将在字符串中匹配:"dont match this: example.com"
仍将与"example.com"
部分匹配。如果那就是你想要的,那很酷。如果没有,您希望通过用/^.....$/
包围正则表达式来锚定字符串的开头和结尾。
答案 1 :(得分:1)
您正在使用与前一个令牌中的0个或更多匹配的*
量词,在这种情况下,您提供了.
,这是一个匹配除换行符之外的任何字符的令牌。
要使域名与子域名匹配,您可以执行以下操作:
(\w+\.)?\w+\.(com|org)
要真正匹配任何域名与TLD,我喜欢这样做:
([a-zA-Z0-9]+\.){1,2}[a-zA-Z]{2,4}
后者将使用数字量子{num}
匹配具有单个子域的任何域,这允许您指定匹配范围,如上面的正则表达式所示。
这允许您匹配一组字母数字字符,然后匹配1到2次(即subdomain.domain.topleveldomain,其中subdomain.
是第一个匹配,domain.
是第二个匹配第一组)。