正则表达式怎么写?从语法到实战的入门指南

liuzw 51 0

正则表达式是文本处理的瑞士军刀,匹配提取替换一把梭。可那堆符号看着像天书,新手望而生畏。其实正则的核心概念就那么几个,拆开学比硬背快得多。把语法骨架和常见用法理一遍,日常文本处理基本能上手。

正则到底是什么

正则表达式是一种描述文本模式的微型语言。你写一个模式,正则引擎拿它去匹配文本,告诉你哪些部分符合。比如模式\d加号在正则里匹配一个或多个数字,它能从一篇文章里把所有数字串揪出来。正则不是编程语言,是嵌入在大部分语言里的工具,语法大同小异。

基础语法骨架

字符类用方括号,比如[aeiou]匹配任一元音字母,[0-9]匹配任一数字。有个简写:\d等价于[0-9]匹配数字,\w匹配字母数字下划线,\s匹配空白,大写版\D\W\S是反义。点号匹配除换行外任意字符,是最常用的通配。

量词控制重复次数:星号匹配0次或多次,加号匹配1次或多次,问号匹配0或1次,花括号{n}匹配恰好n次,{n,m}匹配n到m次。比如\d加号匹配一个或多个数字,\d{3}匹配恰好3位数字。\d{3,4}匹配3到4位。

锚点定位位置:脱字符匹配字符串开头,美元符匹配结尾,\b匹配单词边界。比如^Hello匹配开头是Hello的,ing美元符匹配结尾是ing的。\bword\b只匹配完整的word不匹配password里的word。

分组用圆括号,捕获匹配内容供后续引用。比如(abc)加号匹配abc的一次或多次重复。竖线表示或,cat|dog匹配cat或dog。

贪婪与非贪婪

量词默认贪婪,尽可能多匹配。比如用点星号匹配HTML标签间的内容,点号会一路匹配到最后一个闭合标签,而不是最近的。加个问号变非贪婪,尽可能少匹配。比如点号问号星号会匹配到第一个闭合标签就停。处理HTML和XML时非贪婪几乎是必须的,否则匹配结果会跨标签。

几个实战场景

匹配手机号:模式是1加[3-9]加\d{9},1开头第二位3到9后面9位数字,共11位。匹配邮箱:字母数字加点下划线加@加字母数字加点加字母,大致是[\w.]+@[\w.]+加点加字母。这两个是常见练习,注意正则匹配格式但不验证真实性,邮箱格式对不代表邮箱存在。

提取数字:用\d加号或\d点\d加号能从小数里提取。替换:把匹配到的内容替换成指定字符串,比如把所有连续空格替换成单个空格,模式是空格加号替换成一个空格。

几个常被问的问题

【为什么我的正则在不同语言里结果不一样?】正则引擎有PCRE和POSIX等不同流派,各语言实现略有差异。比如JavaScript默认不支持回顾后发断言,Python的\w默认包含中文。跨语言用正则先测,别假设通用。

【正则能解析HTML吗?】理论上不行,HTML是嵌套结构正则是线性匹配,正规做法用解析器。简单提取可以用正则,但复杂HTML正则会断在嵌套标签上。能用选择器或解析器就别用正则啃HTML。

【怎么调试正则?】用在线正则测试工具,输入模式和文本实时看匹配结果和高亮。本站也有正则测试工具,粘贴模式和文本就能测。先在小样例上测通再用到生产。

正则的学习曲线确实陡,但核心就是字符类、量词、锚点、分组这四块。把这四块拆开学,配合实战场景练,比硬背整张符号表快得多。

标签: 正则表达式 Regex 字符匹配 文本处理

抱歉,评论功能暂时关闭!