正则简单介绍
什么是正则呢? 正则是一种文本处理的库。它是按照一定的规则处理字符串,得到我们想要的结果。现代社会很大一部分信息是以文本形式呈现的,掌握正则,你能玩转文本的世界,大有可为。 正则的本质: 按照一定规则处理文本的类库,其实我们也可以用你熟悉的语言去重写制定规则,写一个文本处理的类库。 正则类库 常用的正则库有pcre,posix等等。学会使用一种库,明白他的思想,你很容易学习另外一种库,他们语法差别不是太大。我们这里以preg为例, 正则是一种规则,遵循规则做事就能得到你想要的。 正则的学习 合适的学习工具让你事半功百: 推荐RegexTest 学习正则前得有一个观念: 正则的规则可以标识一切的文本。 正则的基础元字符: 基本字符 除换行符外的任意字符 \w 字母数字下划线或汉字 \s 空白符 \d 匹配数字 \b 开始或者结束 ^ 字符串开始 $ 字符串结束 量词 -范围 [] 括号中的任意字符 + 1个以上 * 任意个数的 ? 有或者没有 {m} m个 {m,n}m到n个 {m,}m以上个 量词表示数量
基本字符可以表示单个的所有的字符串。 我们可以说说字符串的组成,比如java这个字符串就是由四个字符 j a v a组成的 最直接的表示java 直接这么写就行。看到没这样就行 我们可以用基本字符表示为:\w\w\w\w 如果使用量词,\w+ 更清晰的表示\w{4}
元字符加上量词你就能描述所有的字符串啦。
我们再进一步。如果要从字符串中找到 javajavejevejavejbvbjsvs 中找到jave,java,jeve这三个字符串呢? 可以用到方括号了:j[ae]v[ae]
你可以选择方括号里面的任意一个字符串。 如果不想匹配java,只想匹配其他的类似的字符串:j[^a]v[aebs]
^标识否定的 例如数字为[\d] 非数字[^\d]
如果说[]标识或那么()表示且了,()别名叫分组 比如我们要找到j后面紧跟ave三个单词的字符j(ave)
特殊的情况加入字符串javajave[jevejave 含有[这个字符串我们应该如何表示呢? 没错这个时候就必须用上转义符号\,比如[在正则里面表示为[了。
量词里面又会分为贪婪,懒惰模式 *? +? ?? {n,m}? {n}?加上一个问号就成了懒惰模式,尽量少的匹配 javajavejevejavejbvbjsvs 比如 jav.下是整个串 jav.?加上问号后是javajavejevejave
掌握了上述的语法你就能够熟练的使用正则啦。 什么邮箱验证,什么电话号码验证,什么其他的都是浮云啦。
更进一步更多的规则 捕获 测试字符串:javajavejavajevejavejbvbjsvs (exp)一个括号代表一个分组,捕获文本到分组里面 正则(java)(.)(java) 都在分组里面 (?
反向引用 比如我要匹配javajavejavajevejavejbvbjsvs java与java中间的字符串 你可以java(.)java 你也可以(java)(.)\1 匹配第一个分组匹配到的文档 \n标识第n个分组
零宽断言 i'm sing while you're dancing (?=exp) 匹配exp前面的部分 以ing结尾的字符 \b\w+(?=ing\b) (?<=exp)exp匹配exp后面的位置 以s开头的字符(?<=s)\w+\b (?!exp) 匹配后面不能匹配exp的 \b((?!ing)\w)+\b (?<!exp)匹配前面不能匹配exp的 \b((?!you)\w)+\b
掌握上边一些特性依旧掌握了正则的百分之八十了。
此外还有正则表达式的常用模式了。 i 忽略大小写 m 多行匹配 s 点号通配模式 U 懒惰模式 D结尾限制模式 u 支持UTF-8转义表达