【问题标题】:Regex to check for different ordering? [closed]正则表达式检查不同的顺序? [关闭]
【发布时间】:2023-04-02 04:10:01
【问题描述】:

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

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

我写的正则表达式测试can be found here:

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

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

【问题讨论】:

  • I need to update it,更新是什么意思?你到底想达到什么目标?
  • 当前正则表达式检查该会话对象中的属性是否存在,但如果有人以不同的顺序添加它们,它将失败。 IE。如果有人在secret 之前添加resave,则正则表达式测试失败。
  • 为什么需要检查这个?传递给会话的选项对象应该是无关紧要的。
  • 是的,这三个顺序不限。
  • 这太可怕了,我敦促您重新考虑。否则,您可能会考虑创建 6 个交替 (match1)|(match2) 等的蛮力方法来覆盖 3 个项目的可能排列。

标签: javascript regex


【解决方案1】:

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

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*\})) 将最后的尾随逗号设为可选,这样可以确保如果没有逗号,则在可选空格之后的字符串中前面必须有一个 '}'

您可能不想像此处那样将分号设为可选。

您可能还想split a long regular expression into multiple lines

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多