正則表達式[]和[[]]

在正則表達式中[:digit:]是任意數字,在使用時是[[:digit:]] 多了[] ,爲什麽要把[:digit:]放在[]裏面呢?爲什麽[0-9]在使用時不用放在[]裏面,[:digit:]和[0-9]比起來,爲什麽要多加[]這兩個符號?
[:digit:]{4}和[[:digit:]]{4}有什麽區別,後面的多了[]。

'[:digit:]{4}'和'[[:digit:]]{4}'有沒有區別?
還有一個問題那麽^[^[":digit:"]]是表示首字符是非數字嗎?好像這並不是這個表達方式,而是^[^0-9]
MySQL必知必會一書說 類 [:digit:] 任意數字(同[0-9]) 那爲什麽[0-9]不用多一個方括號而[:digit:]要多一個方括號?
下面是運行結果:

SELECT 'hello2' REGEXP '[0-9]';

返回結果為1

SELECT 'hello2' REGEXP '[:digit:]';

返回結果為0

SELECT 'hello2' REGEXP '[[:digit:]]';

返回結果為1
請解釋原因

【以下回答由 GPT 生成】

[:digit:][[:digit:]]是正则表达式中的字符类别表达式,用于匹配数字字符。相比于[0-9],它们具有更广泛的应用范围和更简洁的语法。下面是对问题中的每个部分的解释:

  1. [:digit:]要放在方括号[]中是因为它是字符类别表达式的一部分。字符类别表达式是用于匹配特定类别的字符的方式,而方括号[]是用于界定一个字符类别的开始和结束的标志。[0-9]不需要方括号是因为它是一个字符范围表达式,用于匹配0到9之间的数字字符。

  2. [:digit:][0-9]的区别在于前者更加通用。[0-9]只能匹配数字字符0到9,而[:digit:]能够匹配任何Unicode数字字符,包括全角数字和其他语言中的数字字符。

  3. [:digit:]{4}表示匹配连续出现的四个数字字符,而[[:digit:]]{4}表示匹配连续出现的四个字符,且这些字符是任何Unicode数字字符。

  4. ^[^[:digit:]]的意思是匹配以非数字字符开头的字符串。^表示匹配行的开始,[^[:digit:]]表示匹配除了任何Unicode数字字符之外的字符。

现在来解释以上代码的结果:

  • SELECT 'hello2' REGEXP '[0-9]'; 返回结果为1,因为'hello2'字符串中包含了数字字符2。
  • SELECT 'hello2' REGEXP '[:digit:]'; 返回结果为0,因为'hello2'字符串中并不包含字符类别表达式[:digit:]匹配的任何字符。
  • SELECT 'hello2' REGEXP '[[:digit:]]'; 返回结果为1,因为'hello2'字符串中包含了字符类别表达式[[:digit:]]匹配的数字字符2。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
\d才是任意数字。[\d]和\d其实是一回事,只是[\dA-Za-z]这种写法,比如说同时允许数字和字母,两种以上的,就需要方括号。

感觉 ada 回答挺正确的