文章目录

正则表达式之所以这么难以理解也许就是因为它所描述的东西本身十分抽象。
以下,我将尝试以我目前的见识水平总结一下对正则表达式相关的知识的理解。

正则表达式最大的作用就是从一大段纷乱的字符串中寻找并定位符合条件的字符串,
而具体的一条正则表达式的含义就是在描述所谓的“条件”——字符串的特征信息,这包括那段字符串本身的内容还有它所在的位置。

  1. 对内容的描述,即对一个字符的描述。
    以下列出对一个字符从最精确到最模糊的描述:
    abc123… 等等,是具体的一个字符
    [a-b]   是其中的某一个
    \d      是数字
    \w      是字母或数字或下划线或汉字
    \s      是任意的空白符
    .       是除换行符以外的任意字符
    
    当然也有否定的描述:
    [^0-9]  不是其中的任何一个
    \D      不是数字
    \W      不是字母,数字,下划线,汉字的字符
    \S      不是空白符的字符
    
  2. 对位置的描述。
    这个位置信息可以是简单的在某词语、某行的首尾也可以是在另一个特定的字符串的前后,也或者不在。
    \b   在单词的开始或结束
    ^    在字符串的开始
    $    在字符串的结束
    (?=exp)     在 exp 前面的位置
    (?<=exp)    在 exp 后面的位置
    (?!exp)     在后面跟的不是 exp 的位置
    (?<!exp)    在前面不是 exp 的位置
    
  3. 逻辑上的描述,或者说为描述加上逻辑。
    加上逻辑描述前正则表达式的能力和普通Ctrl-F的搜索功能其实差不太多,但是有了这层逻辑描述以后正则描述字符串的能力就大大提升了,这就像编程一门语言有了IF-ELSE和DO-WHILE
    首先()是必须有的,括号内看作一个整体,同时也附加了“捕获”的作用(没有捕获的括号是(?:))。

    选择,其实之前说的类似[0-9]的描述中也有简单的字符之间的“或”关系了。

    |,它两边的描述是“或”的关系
    

    重复,这个可以看作一个FOR循环判断,n(m)相当于跳出循环的条件。

    ?    重复零次或一次
    *    重复零次或更多次
    +    重复一次或更多次
    {n}     重复 n 次
    {n,m}   重复 n 到 m 次
    {n,}    重复 n 次或更多次
    

    贪婪与懒惰,这是更高一层的逻辑。

    *?    重复任意次,但尽可能少重复
    +?    重复 1 次或更多次,但尽可能少重复
    ??    重复 0 次或 1 次,但尽可能少重复
    {n,m}?    重复 n 到 m 次,但尽可能少重复
    {n,}?     重复 n 次以上,但尽可能少重复
    

以上并没有包含一般正则表达式所有的语法,从一开始也并没有这个打算,只是想总结一下我的想法,具体学习正则表达式推荐这篇文章
“正则表达式”这种 为了描述字符串信息所设计的 方法究竟好吗?以我现在的见识水平并不能作出判断,隐隐觉得不好。
正则表达式之所以这么难以理解根本就是由于为了语法简洁而不得不做出的牺牲(-.-),因为编程时你完全可以自己写个函数去匹配字符串啊,但也会嫌麻烦吧?这就是程序员们自己挖的坑。

一旦掌握了正则表达式,你就会知道到它简直是工具中的无价之宝,你也难以想象之前那些没有正则表达式的日子是怎么度过的。

文章目录