AEM 调度程序中的正则表达式格式不同

Regex expression format is different in AEM dispatcher

当我们创建具有正斜杠的正则表达式时,我们需要在正斜杠之前放置一个反斜杠,因为正斜杠是未转义的定界符。例如,如果我想让我的正则表达式匹配 /content/att,那么我需要像这样放置正则表达式 /content\/att。这也有效。

但是当我们在 AEM 中添加调度程序规则以允许 url 路径时,非转义分隔符不需要反斜杠。如果有人可以帮助我理解这一点,我将不胜感激,我的意思是为什么我们在编写正则表达式时需要反斜杠,但在调度程序规则的 url 路径中使用相同的正则表达式时却不需要反斜杠。

在调度程序中,查看 url 路径 – /att

之前没有反斜杠
/type "allow"
/url "/content/att"
/extension '(gif)'
}

我不熟悉 AEM Dispatcher,但这里是您的正则表达式问题的通用答案:

那是因为 "/content/att" 是正则表达式的字符串表示。实际的正则表达式是 "/\/content\/att/"。请注意,字符串中的初始斜杠也被转义了。

这是一个例子:这两个 JavaScript 正则表达式是相同的:

  • let regex1 = /^\/content\/att/;
  • let regex2 = new RegExp( "^/content/att" );

简短回答:因为这是两种不同类型的正则表达式。

长答案:

从历史上看,正则表达式首先出现在 QED 和 ed 等文本编辑器中。在那里,正则表达式用于字符串替换(搜索和替换)。这些工具需要一些方法来区分搜索正则表达式和替换字符串,这就是我们得到定界符的原因。例如,替换 ed 中某些文本的命令是 s«DELIMITER»search-regex«DELIMITER»substitution-string«DELIMITER»flags.

大多数单字符定界符都可以使用,但通常选择 /。当然,可以将分隔符用作正则表达式或替换的一部分,在这种情况下,必须使用反斜杠对其进行转义。

一些编程语言已经将 / 编纂为正则表达式文字的实际标准分隔符。 Java脚本就是一个例子。

现在,不需要将正则表达式与替换分开(或允许正则表达式标志)的用法根本不使用定界符。在 Java 中就是这种情况,其中没有正则表达式文字,正则表达式总是使用 Pattern class 从字符串创建。这就是为什么在 AEM 中您不需要转义 /.

您没有向我们展示您的 apache 调度程序配置文件,所以我不确定您在哪里转义了斜杠。我知道 apache 的 mod_rewrite 也不使用定界正则表达式。