【问题标题】:Does JavaScript support composite regular expressions?JavaScript 是否支持复合正则表达式?
【发布时间】:2019-05-01 15:21:27
【问题描述】:

例如,如果我想匹配 ips,我可以这样分解吗:

const octet = /\d{1,3}/;
const ip = /{octet}\.{octet}\.{octet}\.{octet}/;

【问题讨论】:

标签: javascript regex


【解决方案1】:

您可以混合使用 new RegExp() 和模板文字来做类似的事情。

下面是一个例子。

const octet = /\d{1,3}/;
const octetS = octet.source;
const ip = new RegExp(
  `^${octetS}\\.${octetS}\\.${octetS}\\.${octetS}$`);

const ips = [
  '127.0.0.1',
  '10.0.2',
  '12.10.2.5',
  '12'];
  
for (const checkip of ips)
  console.log(`IP: ${checkip} = ${ip.test(checkip)}`);

【讨论】:

  • 请注意,这不会使octet 成为正则表达式,而是使其成为有效的魔术字符串。 Sven 的解决方案,利用 JS RegEx source 属性,在这里可能更好。
  • @Keith 您的原始答案已经足够了,而且我已经这样做了。我只是想知道我是否不能涉及模板文字。
  • 请注意,模板文字是字符串,更好(因为它们几乎总是比普通字符串更快地实现,同时也避免了引号嵌套和字符串连接怪癖的问题) 所以想要避免使用纯字符串并没有多大意义。
  • @Mike'Pomax'Kamermans 我想避免它们,转而使用正则表达式语法转义变量,但似乎没有语法。
【解决方案2】:

使用已声明的正则表达式文字,您可以使用其source 属性来获取不带封闭标签的版本。在新的 RegExp 构造函数中使用模板文字,创建新表达式。

const octet = /\d{1,3}/;
const octetSource = octet.source;
const ip = new RegExp(`^${octetSource}\\.${octetSource}\\.${octetSource}\\.${octetSource}$`);

【讨论】:

  • 使用source 是个好主意,但您仍然需要转义字符串文字中的反斜杠,.. ${octetSource}\\.$
  • IMO 没有更好/更差的答案,您的消息来源是个好主意,这就是为什么我对您的答案投了赞成票,然后自己公然使用它,更多的是因为有人对我投了反对票,并且octet 严格来说不是一个真正的正则表达式,可能会让他们不高兴。
  • 基思的原始答案实际上是我已经尝试过的方式。鉴于最终需要模板文字,我不需要定义任何“真正的”正则表达式。不过,了解源属性非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 2011-10-18
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
相关资源
最近更新 更多