英文:
Golang Regex MatchString Escape Char Dash
问题
正则表达式中的破折号(-)的顺序是否重要?在下面的情况中,validID1没有在破折号(-)之前提到转义字符,因此测试用例失败。如果我在validID1中添加转义字符(^[abcd1234\-_.]$
),那么测试用例将通过。而在validID2中,没有提供转义字符的情况下,测试用例也通过了。为什么会有这样的不同行为?
var validID1 = regexp.MustCompile(`^[abcd1234-_.]$`) // 没有提供转义字符
var validID2 = regexp.MustCompile(`^[abcd1234+-\/]$`) // 对(-)没有提供转义字符,但对(/)提供了转义字符
fmt.Println(validID1.MatchString("adc-")) // false
fmt.Println(validID2.MatchString("adc-")) // true
英文:
Does the sequence of dash (-) in regex matter. In case below cases, validID1 no escape char mentioned before dash (-) and test case failed. If I add escape char in validID1 ((^[abcd1234\-_.]$
)) then test case passed.
Where as in validID2 with out providing escaper char test case passed. Why it is behaving differently.
var validID1 = regexp.MustCompile(`^[abcd1234-_.]$`) // No escape is provided
var validID2 = regexp.MustCompile(`^[abcd1234+-\/]$`) // No escape is provided for(-) but provided for (/)
fmt.Println(validID1.MatchString("adc-")) // false
fmt.Println(validID2.MatchString("adc-")) // true
答案1
得分: 3
翻译结果如下:
在类(用方括号 [..]
表示)中的破折号 -
是一个特殊的元字符(在类的内部)。它们表示一个字符范围,即从 from char
到 to char
。
如果你想要它作为一个字面上的破折号,你需要对它进行转义 \-
,或者将它放在类的开头或结尾,以消除歧义。
所以在你的例子中,这些类所匹配的内容如下:
[abcd1234-_.]
匹配 .123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcd
[abcd1234+-/]
匹配 +,-./1234abcd
在类的外部,破折号没有特殊的元字符含义。
英文:
The Dash -
inside a class (denoted by square brackets [..]
) is a special metacharacter
(inside of classes). They represent a range of characters where = from char - to char
If you want it to be a literal Dash, you'd have to escape it \-
or put it at the beginning or
end of the class which removes the ambiguity.
So in your examples this is what those classes match
[abcd1234-_.]
matches .123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcd
[abcd1234+-/]
matches +,-./1234abcd
Outside of a class, a dash has no special metacharacter meaning.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论