1. 正则表达式基础
正则表达式(Regular Expression,Regex)是定义、搜索、提取和替换字符串模式的强大工具。可以按字面匹配(\d表示数字,\w表示单词字符),也可以用特殊字符表示复杂的模式。例如:^[a-z]+$表示仅包含小写字母的字符串。^表示开头,$表示结尾,[a-z]表示a到z,+表示一个或多个。几乎所有编程语言和文本编辑器都支持它,是输入验证、数据解析和文本替换不可或缺的工具。
实时测试正则表达式模式并查看匹配结果。提供标志设置、分组捕获和常用模式库。
正则表达式(Regular Expression,Regex)是定义、搜索、提取和替换字符串模式的强大工具。可以按字面匹配(\d表示数字,\w表示单词字符),也可以用特殊字符表示复杂的模式。例如:^[a-z]+$表示仅包含小写字母的字符串。^表示开头,$表示结尾,[a-z]表示a到z,+表示一个或多个。几乎所有编程语言和文本编辑器都支持它,是输入验证、数据解析和文本替换不可或缺的工具。
实际工作中经常使用的正则表达式模式。邮箱:^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$,电话号码(美国):^(\+1)?[-.\s]?\(?[0-9]{3}\)?[-.\s]?[0-9]{3}[-.\s]?[0-9]{4}$,URL:^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b,日期(YYYY-MM-DD):^\d{4}-\d{2}-\d{2}$,密码(至少8位,大写+小写+数字+特殊字符):^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$。请以这些模式为基础,根据项目需要进行修改后使用。
正则表达式标志用于控制搜索行为。g(global):查找所有匹配,而不仅仅是第一个。i(ignoreCase):不区分大小写(/hello/i可匹配Hello、HELLO)。m(multiline):^和$匹配每一行的开头/结尾。s(dotAll):.也匹配换行符(\n)。u(unicode):正确处理完整的Unicode(如表情符号)。y(sticky):仅从lastIndex位置开始搜索。例如:/hello/gi忽略大小写查找所有hello。
用括号()创建分组可以捕获匹配的部分以便后续使用。例如:/(\d{4})-(\d{2})-(\d{2})/中,$1是年,$2是月,$3是日。JavaScript的match()结果数组会包含捕获组。反向引用\1、\2匹配与前面分组相同的文本。例如:/(\w+)\s+\1/可匹配「hello hello」。非捕获组(?:)只分组而不捕获,性能更好。
前瞻(lookahead)和后顾(lookbehind)用于检查特定模式的前后内容,但不将其包含在匹配结果中。正向前瞻(?=):/\d(?=px)/仅匹配px前面的数字(「100px」中的100)。负向前瞻(?!):/\d(?!px)/匹配不在px前面的数字。正向后顾(?<=):/(?<=\$)\d+/仅匹配$后面的数字(「$100」中的100)。负向后顾(?<!):则相反。在密码验证中常用于检查是否包含特定字符。
复杂的正则表达式可能引发性能问题。应尽可能写得具体(用[a-z]+而不是.*)。将不必要的捕获组替换为非捕获组(?:)。为减少回溯,使用惰性量词(*?,+?)代替贪婪量词(*,+)。对于大文本,字符串方法(indexOf、startsWith)可能比正则表达式更快。应预先编译正则表达式以便重用(不要反复创建new RegExp)。注意ReDoS(Regular Expression Denial of Service,正则表达式拒绝服务)攻击,切勿将用户输入直接用作正则表达式模式。