涉及花括号的正则表达式不起作用,而对于方括号则有效

Posted

技术标签:

【中文标题】涉及花括号的正则表达式不起作用,而对于方括号则有效【英文标题】:Regex involving curly braces not working, while for square brackets it does 【发布时间】:2021-07-26 14:14:19 【问题描述】:

"[]": "((\\[[^\\]]*($|\\]))(\\][^\\]]*($|\\]))*)

所以它会从ABC A B [ABC] BC 捕获[ABC]。所以任何东西都用方括号括起来。

它按预期工作。

然后我写了一个类似"": "((\\\\[^\\\\]*($|\\\\))(\\\\[^\\\\]*($|\\\\))*)"

的表达式

捕捉abc 之类的东西。现在,这确实适用于在线正则表达式测试器,它从ABC A B ABC BC 捕获abc

但是当我在 JS 代码中使用它时,它什么也没做。同时,方括号表达式做了它应该做的事情。我错过了什么吗?

【问题讨论】:

【参考方案1】:

我没有看到问题。我也尝试使用你的代码,它似乎工作:

function createStringRegex(stringTypes) 
    return new RegExp('^(' + this.createStringPattern(stringTypes) + ')', 'u');
  

// This enables the following string patterns:
// 1. backtick quoted string using `` to escape
// 2. square bracket quoted string (SQL Server) using ]] to escape
// 3. double quoted string using "" or \" to escape

function createStringPattern(stringTypes) 
  const patterns = 
    '``': '((`[^`]*($|`))+)',
    '[]': '((\\[[^\\]]*($|\\]))(\\][^\\]]*($|\\]))*)',
    "": "((\\\\[^\\\\]*($|\\\\))(\\\\[^\\\\]*($|\\\\))*)",
    '""': '(("[^"\\\\]*(?:\\\\.[^"\\\\]*)*("|$))+)',
    "''": "(('[^'\\\\]*(?:\\\\.[^'\\\\]*)*('|$))+)",
    "N''": "((N'[^N'\\\\]*(?:\\\\.[^N'\\\\]*)*('|$))+)"
  ;

  return stringTypes.map(t => patterns[t]).join('|');


console.log("[abc]".match(createStringRegex(["[]"])));     // it matches 
console.log("abc".match(createStringRegex([""]))); // it matches
console.log("[abc]".match(createStringRegex([""])));   // it doesn't match

【讨论】:

正则表达式在另一个函数中,我遵循其余表达式的格式,情况类似于***.com/questions/28549707/… 没错!它似乎以其他方式工作。只是不在 JS 文件中,其他表达式在其中起作用。 @arpo 对我来说它似乎有效。这不是预期的行为吗? 确实是预期的行为。非常感谢fr,意识到缺少了什么。 如果不麻烦,你能看看这个吗? "": "((\\\\[^\\\\]*($|\\+))(\\\\[^\\\\]*($|\\\\))*)" 这是在常规 abc 之上捕获诸如 abc 或 n 个封闭大括号之类的好逻辑吗?

以上是关于涉及花括号的正则表达式不起作用,而对于方括号则有效的主要内容,如果未能解决你的问题,请参考以下文章

Python正则表达式中括号的作用

正则表达式用于选择花括号内的双引号而忽略外部的引号

我正在尝试使用正则表达式来指定字符数量。大括号不起作用[重复]

Vue.js - 双花括号(Mustache)语法不起作用/渲染到页面

如何用正则表达式匹配括号中的内容,不包含括号

如何用正则表达式匹配括号中的内容。