首页 > 解决方案 > 正则表达式检查不同的顺序?

问题描述

我正在尝试编写一个正则表达式来检查是否已写入以下内容:

session({
  secret: "asdfadf",
  resave: false,
  saveUninitialized: false,
});

我写的正则表达式测试可以在这里找到

session\(\{\s*secret\:\s*("|')\w*("|')\s*,\s*resave\s*\:\s*false\,\s*saveUninitialized\:\s*false\,?\s*\}\)

我需要更新它,以便可以以不同的顺序添加属性并仍然通过正则表达式测试。是否有一个组或方法来设置它以使其通过?

标签: javascriptregex

解决方案


如果我们想创建一个匹配由子字符串组成的字符串的正则表达式

Doe Ray Me Far Sew La Tea

以任何顺序,并且我们不想繁琐地创建一个很长的表达式,包括所有可能的顺序,我们可以从尝试开始

(Doe|Ray|Me|Far|Sew|La|Tea){7}

它匹配包含任意顺序的七个子字符串的字符串。

然后我们遇到的问题是,如果一个或多个子字符串重复或丢失,表达式不会匹配失败。

确保每个子字符串只出现一次的一种方法是为每个备选方案添加一个负前瞻,以确保它不会在匹配之前再次出现在字符串中。

(Doe(?!.*D)|Ray(?!.*R)|Me(?!.*M)|Far(?!.*F)|Sew(?!.*S)|La(?!.*L)|Tea(?!.*T)){7}

请注意,在前瞻中只需要子字符串的第一个字母,因为每个子字符串的第一个字母不同。

在您的特定情况下,尽管尚未经过彻底测试,但以下内容似乎可以正常工作。

最后的尾随逗号是可选的(,|(?=\s*\})),这确保如果没有逗号,那么'}'在可选空格之后的字符串中必须有一个前导。

您可能不想像此处那样使分号成为可选。

您可能还想将一个长正则表达式拆分为多行

const input = `session({
  secret: "asdfadf",
  resave: false,
  saveUninitialized: false,
});`;

const regex = /^session\s*\(\s*\{\s*((secret\s*:\s*(?<q>["'])\w*\k<q>(?!.*c)|resave\s*\:\s*false(?!.*e\s*:)|saveUninitialized\s*:\s*false(?!.*d\s*:))\s*(,|(?=\s*\}))\s*){3}\}\s*\)\s*;?$/;

console.log(regex.test(input));


推荐阅读