求助:Elasticsearch正则匹配域名及子域名(不含伪域名)
Elasticsearch正则匹配nytimes.com主域名及所有子域名的解决方案
直接用这个正则表达式就能满足需求:^(?:.*\.)?nytimes\.com$
正则各部分说明:
^:锁定字符串开头,避免匹配到字符串中间包含nytimes.com的情况(?:.*\.)?:非捕获分组,.*匹配任意长度的子域名内容(支持数字、字母、连字符,以及多级子域名如a.b.),\.匹配子域名和主域名之间的点号,?表示该分组可选,也就是允许直接匹配主域名nytimes.comnytimes\.com:精确匹配主域名部分,这里的\.必须转义,否则正则里的.会匹配任意字符$:锁定字符串结尾,确保不会匹配到fakenytimes.com这类域名(因为这类域名结尾是times.com,不符合nytimes.com$的要求)
Elasticsearch中使用示例(regexp查询):
{ "query": { "regexp": { "your_domain_field_name": "^(?:.*\\.)?nytimes\\.com$" } } }
注意在JSON格式中,反斜杠需要额外转义,所以写成\\.而不是\.。
为什么你之前的正则不行:
你尝试的([a-z].?)nytimes.com有几个问题:
- 只允许单个小写字母开头,无法匹配包含数字、连字符或多级子域名的情况
- 没有用
^和$锁定首尾,可能会误匹配到包含nytimes.com的长字符串 - 点号未转义,
nytimes.com里的.会匹配任意字符,而非实际的点号
内容的提问来源于stack exchange,提问作者Yoni Levine
相关产品推荐
相关产品推荐

