与模式匹配但与#34;匹配的正则表达式:"

时间:2015-06-02 23:59:11

标签: ruby regex

我有一个正则表达式,可以查找某些类型的主机名,例如:.*-.*(nmtg)*|.*(\.nms)。如何修改它以使其不匹配:11.22:33:44:55-66

应匹配:

cs25-admin.nmtg.company.com 
cs25-admin

但不应该匹配:

11.22:33:44:55-66

2 个答案:

答案 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.是第二个匹配第一组)。