De.Minov Asked:2022-08-30 20:23:31 +0000 UTC2022-08-30 20:23:31 +0000 UTC 2022-08-30 20:23:31 +0000 UTC 忽略正则表达式中的正则表达式匹配 772 您需要使用正则表达式来查找“多行”代码注释,例如/**/. 我写了一个正则表达式\/\*(?:.*|\s*)\*\/(regex101),一般来说它可以工作,但是如果在评论中遇到评论,那么正则表达式只考虑“更深”的那个 如何在正则表达式中忽略正则表达式? javascript 1 个回答 Voted Best Answer Laukhin Andrey 2022-09-03T13:43:16Z2022-09-03T13:43:16Z 获取代码中的注释 如果任务是像编译器(和代码编辑器)那样查找多行注释,那么解决方案似乎很简单: /\/\*.*?\*\//gs 考试 底线:打开后,/*我们对第一个做出反应*/。而且效果很好。 但也有细微差别。 首先。如果评论是打开的,但没有结束标签,那么你应该选择文本末尾的所有内容。定影: /\/\*.*?(?:\*\/|$)/gs 第二。如果构造/**/出现在字符串常量中(用引号括起来),那么这些构造也会被突出显示。*/奇怪的是,即使标签用引号引起来,打开的评论也会关闭标签。下面是对上述内容的演示: 由此我们可以得出结论,在字符串常量中显式使用这些标签原则上是不好的做法。因此在代码中遇到这种情况的概率非常小。 然而,在一个常规赛季中考虑到这一点是非常可取的。 因此,字符串常量和注释会被抽样。RW 用于选择单引号中的字符串,包括转义的字符串:我们以'(?:\\.|[^\\'])*(?:'|$) 相同的方式选择:直到结束引号,或者直到文本结尾(我们稍后会讨论)。 遵循“谁先开,那个和符号”的原则,可以作如下表达: /\/\*.*?(?:\*\/|$)|"(?:\\.|[^\\"])*(?:"|$)|'(?:\\. |[^\\'])*(?:'|$)/gs 很明显,结果将包含注释和引用的字符串。我们只需要按第一个字符过滤选择。如果/,则发表评论。 好吧,为了全图,您需要添加一行注释//: /\/\*.*?(?:\*\/|$)|\/\/[^\n]+?\n|"(?:\\.|[^\\"])*( ?:"|$)|'(?:\\.|[^\\'])*(?:'|$)/gs 细微差别第三。一些语言支持设置多行字符串,而另一些则不支持,或者为此提供了特殊的构造(如 JS 中的反引号)。这取决于代码编辑器如何突出显示行和注释。 上面的 rv 适用于例如 PHP。 如果语言只支持指定单行字符串,那么您需要更改突出显示字符串常量的条件(直到行尾,而不是文本): /\/\*.*?(?:\*\/|$)|\/\/[^\n]+?\n|"(?:\\.|[^\\"])*? (?:"|\n)|'(?:\\.|[^\\'])*?(?:'|\n)/gs 在 JS 中,您可以使用连字符指定多行字符串\,也可以使用反引号。RW 中已经考虑了第一个选项,应该添加第二个选项: /\/\*.*?(?:\*\/|$)|\/\/[^\n]+?\n|"(?:\\.|[^\\"])*? (?:"|\n)|'(?:\\.|[^\\'])*?(?:'|\n)|`(?:\\.|[^\\`]) *?(?:`|$)/gs 使用 Notepad++ 和 Visual Studio Code 测试。当然,可能还有更多细微差别。人们建议对此类任务使用解析器。 分层选择(嵌套匹配) 如您所知,RegExJavaScript 不支持递归。这个库可以作为摆脱这种情况的一种方式。 原生 RegEx 可以做什么? 让我们用单字符标签来分析情况,例如{和}。 选择层次结构中最深元素的条件很简单:该元素内部不包含 { 和 } 标签: {[^{}]*} Check 选择父元素的条件类似。它包含一个子元素,其他元素被排除在它自己的标签和子标签之间 {[^{}]*{[^{}]*}[^{}]*} : 泛化 令 L 为开始标记,R 为结束标记,# 为元素内容的条件。那么广义方案将如下所示: L0 L # R L1 L# L# R# R L2 L# L# L# R# R# R L3 L# L# L# L# R# R# R# R ………… 以及嵌套级别为 n 的“递归”选择的完整正则表达式: Pn = L0|L1|L2|L3|...|Ln (我们从深度计算级别) P3检查 多字符标签。在这里,元素内容的条件看起来不同: (?:.(?<!L))*?,其中 L 是左标签。您需要添加一个修饰符s。然后一切都按照计划进行。 检查 P0 /检查 P3 因此,使用本机 RegEx,我们可以针对有限范围的任务进行具有已知嵌套级别的分层选择。正如你所看到的,这个怪物随着每个级别的增长而增长。我希望这些信息对某人有用。
获取代码中的注释
如果任务是像编译器(和代码编辑器)那样查找多行注释,那么解决方案似乎很简单:
/\/\*.*?\*\//gs考试底线:打开后,
/*我们对第一个做出反应*/。而且效果很好。但也有细微差别。
首先。如果评论是打开的,但没有结束标签,那么你应该选择文本末尾的所有内容。定影:
/\/\*.*?(?:\*\/|$)/gs第二。如果构造

/**/出现在字符串常量中(用引号括起来),那么这些构造也会被突出显示。*/奇怪的是,即使标签用引号引起来,打开的评论也会关闭标签。下面是对上述内容的演示: 由此我们可以得出结论,在字符串常量中显式使用这些标签原则上是不好的做法。因此在代码中遇到这种情况的概率非常小。然而,在一个常规赛季中考虑到这一点是非常可取的。
因此,字符串常量和注释会被抽样。RW 用于选择单引号中的字符串,包括转义的字符串:我们以
'(?:\\.|[^\\'])*(?:'|$)相同的方式选择:直到结束引号,或者直到文本结尾(我们稍后会讨论)。
遵循“谁先开,那个和符号”的原则,可以作如下表达:
很明显,结果将包含注释和引用的字符串。我们只需要按第一个字符过滤选择。如果
/,则发表评论。好吧,为了全图,您需要添加一行注释
//:细微差别第三。一些语言支持设置多行字符串,而另一些则不支持,或者为此提供了特殊的构造(如 JS 中的反引号)。这取决于代码编辑器如何突出显示行和注释。
上面的 rv 适用于例如 PHP。
如果语言只支持指定单行字符串,那么您需要更改突出显示字符串常量的条件(直到行尾,而不是文本):
在 JS 中,您可以使用连字符指定多行字符串
\,也可以使用反引号。RW 中已经考虑了第一个选项,应该添加第二个选项:使用 Notepad++ 和 Visual Studio Code 测试。当然,可能还有更多细微差别。人们建议对此类任务使用解析器。
分层选择(嵌套匹配)
如您所知,
RegExJavaScript 不支持递归。这个库可以作为摆脱这种情况的一种方式。原生 RegEx 可以做什么?
让我们用单字符标签来分析情况,例如
{和}。选择层次结构中最深元素的条件很简单:该元素内部不包含 { 和 } 标签:
{[^{}]*}Check选择父元素的条件类似。它包含一个子元素,其他元素被排除在它自己的标签和子标签之间
{[^{}]*{[^{}]*}[^{}]*}:泛化
令 L 为开始标记,R 为结束标记,# 为元素内容的条件。那么广义方案将如下所示:
以及嵌套级别为 n 的“递归”选择的完整正则表达式:
Pn = L0|L1|L2|L3|...|Ln
(我们从深度计算级别)
P3检查
多字符标签。在这里,元素内容的条件看起来不同:
(?:.(?<!L))*?,其中 L 是左标签。您需要添加一个修饰符s。然后一切都按照计划进行。检查 P0 /检查 P3
因此,使用本机 RegEx,我们可以针对有限范围的任务进行具有已知嵌套级别的分层选择。正如你所看到的,这个怪物随着每个级别的增长而增长。我希望这些信息对某人有用。