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

时间:2018-04-27 12:15:04

标签: elisp

大家好,

我对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一样,这些都返回true:

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


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

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

这是一张regex101:https://regex101.com/r/e8sLXr/1

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

有谁知道我错过了什么可以帮助我?

干杯,

托马斯

编辑:语法

1 个答案:

答案 0 :(得分:1)

首先,让我们抛弃反斜杠。 []对字符串(*)并不特殊,因此转义它们不会改变它们。所以以下内容是等效的,更易于阅读:

(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

此模式与[]完全匹配,因为[[]是匹配包含单字符[的集合中任何内容的字符替代;然后该字符替代后跟](当结束字符替代时,只匹配自己)。

你会想要阅读"字符替代"详情请见:

C-h i g (elisp)Regexp Special RET

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

你的正则表达式没有任何反斜杠 - 因为在双引号字符串格式中你需要加倍反斜杠以包含正则表达式中的反斜杠 - 但如果你已经这样做了,如果它们是< em>也在字符替换中,它只是意味着反斜杠是该组匹配的字符之一。

e.g。 "[\\]\\[]"是匹配[\]\[]

的正则表达式\[]

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