0

这个简单的例子显示了我遇到的问题,但我不明白为什么......

我正在测试传递给我的字符串参数中第一个字符的位置,该字符是小写或大写字母、单个破折号或句点。

这两个模式匹配似乎检查了同样的事情,但你自己运行这段代码,它会打印一个 0,然后是一个 3:

PRINT PATINDEX ( '%[a-z,A-Z,-,.]%', '16-82') 
PRINT PATINDEX ( '%[-,a-z,A-Z,.]%', '16-82') 

我不明白为什么只有当破折号字符是我们检查的第一个字符时它才有效。

这是一个错误吗?或者按设计工作,但我错过了一些东西......我正在使用 SQL Server 2016,但我认为这并不重要。

4

1 回答 1

4

字符组中的破折号可以扮演以下两种角色之一:

  • 它可能表示破折号本身,就像它在表达式中一样[-abc]
  • 它可能表示“中间的一切”运算符,就像它在表达式中所做的那样[a-z]

在您的特定示例中,字符组[a-z,A-Z,-,.]表示以下内容:

  • 一切从az
  • 逗号,
  • 一切从AZ
  • 一切从,to , (即再次只是逗号)。
  • .

事实上,你可能想写[-a-zA-Z.]

于 2018-05-23T23:45:07.293 回答