javascript - 正则表达式检查不同的顺序?
问题描述
我正在尝试编写一个正则表达式来检查是否已写入以下内容:
session({
secret: "asdfadf",
resave: false,
saveUninitialized: false,
});
我写的正则表达式测试可以在这里找到:
session\(\{\s*secret\:\s*("|')\w*("|')\s*,\s*resave\s*\:\s*false\,\s*saveUninitialized\:\s*false\,?\s*\}\)
我需要更新它,以便可以以不同的顺序添加属性并仍然通过正则表达式测试。是否有一个组或方法来设置它以使其通过?
解决方案
如果我们想创建一个匹配由子字符串组成的字符串的正则表达式
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));
推荐阅读
- android - 如何检查或查找任何 android 应用程序嵌入网站
- reactjs - 如何修复 React 中的“未捕获错误:找不到模块“./routes”?
- ios - 如何在 ios swift 基础应用程序中管理内存?
- git - 如何从 GitHub API 只获取 15 个存储库?
- css - 如何将高斯模糊 PSD 转换为 css3?
- c# - 动态地将新文本框添加到表单时如何摆脱“在窗口错误上创建句柄”
- scala - 给定文件路径,使用 Scala 找到文件扩展名?
- android - 如何在后台执行 API 调用?
- android - IOS Swift 中的应用程序类
- ios - 使用框架函数而不导入