匹配单个方括号时的正则表达式顺序

Regex order when matching single square bracket

大家好,

我对 Elisp 中的特定正则表达式有疑问,特别是在 Elisp 中。我正在尝试匹配一个方括号,ielm 有这个:

  (string-match "[\]\[]" "[")  ; ===> 0
  (string-match "[\[\]]" "[")  ; ===> nil

  (string-match "[\]\[]" "]")  ; ===> 0
  (string-match "[\[\]]" "]")  ; ===> nil

  (string-match "[\[\]]" "[]") ; ===> 0
  (string-match "[\]\[]" "[]") ; ===> 0
  (string-match "[\]\[]" "][") ; ===> 0
  (string-match "[\]\[]" "][") ; ===> 0

与 JS 一样,这些都是 return 正确的:

'['.match(/[\[\]]/) // ===>['[']
'['.match(/[\]\[]/) // ===>['[']


']'.match(/[\[\]]/) // ===>[']']
']'.match(/[\]\[]/) // ===>[']']

'[]'.match(/[\[\]]/) // ===>['[']
'[]'.match(/[\]\[]/) // ===>['[']
']['.match(/[\[\]]/) // ===>[']']
']['.match(/[\]\[]/) // ===>[']']

这是一个正则表达式 101:https://regex101.com/r/e8sLXr/1

我不明白为什么我的方括号在 Elisp 中的顺序很重要。我试过使用双反斜杠,但没有用。实际上,它在这些正则表达式上给了我更多的零,而我认为在正则表达式处理的字符串中转义 backslack 的正确方法是将其加倍:https://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Example.html#Regexp-Example

有谁知道我遗漏了什么可以帮助我吗?

干杯,

托马斯

编辑:语法

首先,让我们去掉反斜杠。 [] 不是字符串 (*) 特有的,因此转义它们不会改变它们。所以下面是等价的,更容易阅读:

(string-match "[][]" "[")  ; ===> 0
(string-match "[][]" "]")  ; ===> 0
(string-match "[][]" "[]") ; ===> 0
(string-match "[][]" "][") ; ===> 0
(string-match "[][]" "][") ; ===> 0

此模式匹配 ][,并且所有被测试的字符串都以其中一个字符开头;因此我们在每种情况下都匹配位置 0

重要的是,要在替代字符中包含 ],它 必须 是第一个字符。因此以下 没有 做你想做的事:

(string-match "[[]]" "[")  ; ===> nil
(string-match "[[]]" "]")  ; ===> nil
(string-match "[[]]" "[]") ; ===> 0

这个模式完全匹配 [],因为 [[] 是一个字符替代匹配包含单个字符 [ 的集合中的任何字符;然后该字符替代后跟 ](当它是 not 结束字符替代时,它只匹配自身)。

您需要在以下位置阅读 "character alternative" 详细信息:

C-hig (elisp)Regexp Special RET


(*) 另请注意,当反斜杠在 字符替代项中时,它们对正则表达式来说并不特殊。

您的正则表达式没有任何反斜杠——因为在双引号字符串格式中,您需要将反斜杠加倍以将其包含在正则表达式中——但如果您这样做了,并且它们是 also 在替代字符中,它只是意味着反斜杠将是该集合匹配的字符之一。

例如"[\]\[]" 是匹配 \[]

的正则表达式 [\]\[]

(记住 ] 不能出现在替代字符中,除非它是 第一个 字符。)