匹配单个方括号时的正则表达式顺序
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 在替代字符中,它只是意味着反斜杠将是该集合匹配的字符之一。
例如"[\]\[]"
是匹配 \[]
的正则表达式 [\]\[]
(记住 ]
不能出现在替代字符中,除非它是 第一个 字符。)
大家好,
我对 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 在替代字符中,它只是意味着反斜杠将是该集合匹配的字符之一。
例如"[\]\[]"
是匹配 \[]
[\]\[]
(记住 ]
不能出现在替代字符中,除非它是 第一个 字符。)