我编写了一个Javascript routine ,在给定主机名或URL的情况下,它的值为finds the root domain.

function getRootDomain(s){
  var sResult = ''
  try {
    sResult = s.match(/^(?:.*\:\/?\/)?(?<domain>[\w\-\.]*)/).groups.domain
      .match(/(?<root>[\w\-]*(\.\w{3,}|\.\w{2}|\.\w{2}\.\w{2}))$/).groups.root;
  } catch(ignore) {}
  return sResult;
}

将两个正则表达式规则组合成一个规则的技巧是什么?

多年来,我用this tutorial来提升我现有的RegExp经验,尽管我从未真正理解lookbehinds和lookaheads(这在这里可能有用?),然后在RegEx101.com使用伟大的工具进行try 和错误.我试着用<root>后面的替换<domain>后面的,以及它的变体,但都失败了.

推荐答案

第二个regexp使用$断言只匹配.domain捕获的结尾.

然而,第一个RegExp在域之后停止匹配(当它遇到/?#:或字符串末尾时,如果没有路径、查询字符串或散列部分.因此,您不能只重用$断言,它在某些情况下会失败.

要组合这两个部分,可以用以下内容替换domain捕获:

.*?(?<root>[\w\-]*(\.\w{3,}|\.\w{2}|\.\w{2}\.\w{2}))(?:[\/?#:]|$)

末尾的(?:[\/?#]|$)是一个非捕获组,与目标字符或字符串结尾匹配.

.*?个节俭匹配任何东西.也就是说,它首先try 匹配root次捕获,然后是(?:[\/?#]|$)次捕获.每次失败时,它会吃掉一个字符,然后再试一次,让你搜索root.

也:

  • 你可以把\.\w{3,}|\.\w{2}合并成\.\w{2,}.

  • 您可以在TLD周围使用非捕获组((?:...)(...)).

  • 最好使用.*?来获取协议,否则可能会导致全局搜索过多(贪婪的.*,通过https://example.com/#://bar.com将返回bar.com).

  • 你不需要逃避:.在unicode模式下,这种转义实际上是一种语法错误.

导致

const x = /^(?:.*?:\/\/?)?.*?(?<root>[\w\-]*(?:\.\w{2,}|\.\w{2}\.\w{2}))(?:[\/?#:]|$)/

事实上,我写了一个RegExp生成器,它可能会帮助你在RegExp学习之旅中走得更远...Here's your RegExp ported to compose-regexp

Javascript相关问答推荐

if/else JavaScript中的条件行为

字节数组通过echo框架传输到JS blob

调用removeEvents不起作用

如何从html元素创建树 struct ?

如何通过使用vanilla JS限制字体大小增加或减少两次来改变字体大小

使用Nuxt Apollo在Piniastore 中获取产品细节

如何利用CSS中的隐藏元素实现平滑扩展和防止网格行间隙

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

如果没有页面重新加载Angular ,innerHTML属性绑定不会更新

无法重定向到Next.js中的动态URL

Phaser3 preFX addGlow不支持zoom

JavaScript&;Reaction-如何避免在不使用字典/对象的情况下出现地狱?

在JavaScript中将Base64转换为JSON

将Singleton实例设置为未定义后的Angular 变量引用持久性行为

有角粘桌盒阴影

更新文本区域行号

如何阻止外部脚本进入顶层导航

Rails 7:在不使用导入映射的情况下导入Java脚本

更改输入文本框的背景时出现问题

在两个数组范围中输入日期范围