为什么这种比较会回归? (常用表达)

时间:2016-04-17 18:21:50

标签: regex

1)mysql> SELECT 'aXbc' REGEXP '[a-dXYZ]';                 -> 1
2)mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]$';               -> 0    
3)mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]?$';              -> 0   // 0 or 1
4)mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]+$';              -> 1   // 1 or more
5)mysql> SELECT 'aXbc' REGEXP '^[a-dXYZ]*$';              -> 1   //0 or more

我对第二次比较感到困惑。这不是指以[a-dXYZ]开头并以[a-dXYZ]结尾的字符串吗?

或者它是指以[a-dXYZ]开头并以[a-dXYZ]结尾的字符串,其长度为1?如果这是真的,使用^和$符号如'^ .... $'(最左边和最右边)消除所有子串并仅分析整个字符串 - 是吗?

注意:这不是我怎么能提出问题的。我想了解因果关系。

1 个答案:

答案 0 :(得分:2)

^[a-dXYZ]$只会匹配一个字符:abcdX,{{1 },Y并且是第一个字符,也是最后一个字符。所以你的第二个观察是非常直接的。

Z表示输入开始,^表示输入结束。

您可以使用$重复0次或更多次,或*重复1次或更多次:

+

如果要匹配以^[a-dXYZ]+$ 开头和结尾的字符串,可以使用以下内容:

[a-dXYZ]

在某些正则表达式实现中,您可以使用^[a-dXYZ].*[a-dXYZ]$ # ^ Match anything zero or more times 修饰符,这将使m^匹配行的开头和结尾,而不是输入,请考虑以下Perl代码段:

$

它将替换所有仅一致的行:

s/^1+$/_/gm