正则表达式:不包括子域URL

时间:2019-10-05 04:37:46

标签: regex

我想使用Regex对网址进行排序。此外,我有要排除的域。我想保留属于www.test.com(虚构示例)的所有域,除了:www.test.com/...、www.abc.test.com/...、www.def.test.com /...

我感兴趣的网站还有许多其他子域,例如www.ghi.test.com,www.jkl.test.com,www.a.test.com ...

我尝试使用否定查询,但是我很难找到自己满意的表达式。

我还想知道是否可以仅给出一个子域列表并创建适合我的情况的正则表达式,例如['www','abc','def']。添加异常会容易得多

谢谢!

2 个答案:

答案 0 :(得分:1)

确定:(?!www.(?:abc|def).test.com)(?=www.*\.test\..*com)^.+$

这使用否定的前瞻性断言您最终获得的匹配不包括您不想要的任何子域,并包括肯定的前瞻性以确保我们匹配www.test.com(以某种形式)

  • (?!www.(?:abc|def).test.com)断言abcdef 不要出现在网址中。您可以根据需要在此列表中添加任意数量。
  • (?=www.*\.test\..*com)断言www出现在com.test.之间。
  • ^.+$捕获通过两次前行的所有非零长度线。

Try it here!

答案 1 :(得分:0)

您是不是要有效地将所有*.test.com子域归为test.com的子域?

如果是这样,您可以使用以下变量:Get Domain Extension From Hostname

function getDomain(domain) {
  const domainExpression = /\w+((\.[a-z]{2,3})(\.(ad|ae|af|ag|ai|al|am|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bl|bm|bn|bo|bq|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cu|cv|cw|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|er|es|et|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mf|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw))?)$/i;
  const match = domainExpression.exec(domain);
  
  return match ? match[0] : domain;
}

function test(input, expectedOutput) {
  const output = getDomain(input);
  console.log(`${output === expectedOutput ? 'PASS' : 'FAIL'}: ${input} (expected: ${expectedOutput}, output: ${output})`);
}

test('www.test.com', 'test.com');
test('www.abc.test.com', 'test.com');
test('www.jjj.sss.test.com', 'test.com');
test('www.test.com.au', 'test.com.au');
test('www.sub.test.com.au', 'test.com.au');