正则表达式
1-6个字符的正则

1-6个字符的正则
正则表达式是一种用于匹配字符串模式的工具。
下面是可以匹配1到6个字符的正则表达式示例:
1. ^.{1,6}$。
这个正则表达式可以匹配任意1到6个字符的字符串。
其中,^表示字符串的开始,.{1,6}表示匹配任意1到6个字符,$表示字符串的结束。
2. ^\w{1,6}$。
这个正则表达式可以匹配包含1到6个字母、数字或下划线的字符串。
其中,\w表示匹配字母、数字或下划线,{1,6}表示匹配1到6个。
3. ^[a-zA-Z0-9]{1,6}$。
这个正则表达式可以匹配包含1到6个大写字母、小写字母或数字的字符串。
其中,[a-zA-Z0-9]表示匹配任意一个大写字母、小
写字母或数字。
4. ^[\u4e00-\u9fa5]{1,6}$。
这个正则表达式可以匹配包含1到6个中文字符的字符串。
其中,[\u4e00-\u9fa5]表示匹配任意一个中文字符。
5. ^[a-zA-Z]{1,3}$。
这个正则表达式可以匹配包含1到3个大写字母或小写字母的字符串。
其中,[a-zA-Z]表示匹配任意一个大写字母或小写字母。
6. ^[0-9]{1,6}$。
这个正则表达式可以匹配包含1到6个数字的字符串。
其中,[0-9]表示匹配任意一个数字。
以上是几个可以匹配1到6个字符的正则表达式示例,你可以根据具体的需求选择适合的正则表达式。
常用正则表达式匹配大全

常用正则表达式大全匹配中文字符的正则表达式:[u4e00-u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了匹配双字节字符(包括汉字在内):[^x00-xff]评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)匹配空白行的正则表达式:ns*r评注:可以用来删除空白行匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? />评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力匹配首尾空白字符的正则表达式:^s*|s*$评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*评注:表单验证时很实用匹配网址URL的正则表达式:[a-zA-z]+://[^s]*评注:网上流传的版本功能很有限,上面这个基本可以满足需求匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 评注:表单验证时很实用匹配国内电话号码:d{3}-d{8}|d{4}-d{7}评注:匹配形式如0511-******* 或021-********匹配腾讯QQ号:[1-9][0-9]{4,}评注:腾讯QQ号从10000开始匹配中国邮政编码:[1-9]d{5}(?!d)评注:中国邮政编码为6位数字匹配身份证:d{15}|d{18}评注:中国的身份证为15位或18位匹配ip地址:d+.d+.d+.d+评注:提取ip地址时有用匹配特定数字:^[1-9]d*$//匹配正整数^-[1-9]d*$ //匹配负整数^-?[1-9]d*$//匹配整数^[1-9]d*|0$//匹配非负整数(正整数+ 0)^-[1-9]d*|0$//匹配非正整数(负整数+ 0)^[1-9]d*.d*|0.d*[1-9]d*$//匹配正浮点数^-([1-9]d*.d*|0.d*[1-9]d*)$//匹配负浮点数^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$//匹配浮点数^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$//匹配非负浮点数(正浮点数+ 0)^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$//匹配非正浮点数(负浮点数+ 0)评注:处理大量数据时有用,具体应用时注意修正匹配特定字符串:^[A-Za-z]+$//匹配由26个英文字母组成的字符串^[A-Z]+$//匹配由26个英文字母的大写组成的字符串^[a-z]+$//匹配由26个英文字母的小写组成的字符串^[A-Za-z0-9]+$//匹配由数字和26个英文字母组成的字符串^w+$//匹配由数字、26个英文字母或者下划线组成的字符串在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下: 只能输入数字:“^[0-9]*$”只能输入n位的数字:“^d{n}$”只能输入至少n位数字:“^d{n,}$”只能输入m-n位的数字:“^d{m,n}$”只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$”只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$”只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$”只能输入非零的正整数:“^+?[1-9][0-9]*$”只能输入非零的负整数:“^-[1-9][0-9]*$”只能输入长度为3的字符:“^.{3}$”只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$”只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$”只能输入由26个小写英文字母组成的字符串:“^[a-z]+$”只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$”只能输入由数字、26个英文字母或者下划线组成的字符串:“^w+$”验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。
常用正则表达式大全!(例如:匹配中文、匹配html)

常⽤正则表达式⼤全!(例如:匹配中⽂、匹配html)⼀、常见正则表达式 匹配中⽂字符的正则表达式: [u4e00-u9fa5] 评注:匹配中⽂还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以⽤来计算字符串的长度(⼀个双字节字符长度计2,ASCII字符计1) 匹配空⽩⾏的正则表达式:ns*r 评注:可以⽤来删除空⽩⾏ 匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? /> 评注:⽹上流传的版本太糟糕,上⾯这个也仅仅能匹配部分,对于复杂的嵌套标记依旧⽆能为⼒ 匹配⾸尾空⽩字符的正则表达式:^s*|s*$ 评注:可以⽤来删除⾏⾸⾏尾的空⽩字符(包括空格、制表符、换页符等等),⾮常有⽤的表达式 匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 评注:表单验证时很实⽤ 匹配⽹址URL的正则表达式:^(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?$ 评注:⽹上流传的版本功能很有限,上⾯这个基本可以满⾜需求匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 评注:表单验证时很实⽤ 匹配国内电话号码:d{3}-d{8}|d{4}-d{7} 评注:匹配形式如 0511-******* 或 021-******** 匹配腾讯QQ号:[1-9][0-9]{4,} 评注:腾讯QQ号从10000开始 匹配中国邮政编码:[1-9]d{5}(?!d) 评注:中国邮政编码为6位数字 匹配⾝份证:d{15}|d{18} 评注:中国的⾝份证为15位或18位 匹配ip地址:d+.d+.d+.d+ 评注:提取ip地址时有⽤ 匹配特定数字: ^[1-9]d*$ //匹配正整数 ^-[1-9]d*$ //匹配负整数 ^-?[1-9]d*$ //匹配整数 ^[1-9]d*|0$ //匹配⾮负整数(正整数 + 0) ^-[1-9]d*|0$ //匹配⾮正整数(负整数 + 0) ^[1-9]d*.d*|0.d*[1-9]d*$ //匹配正浮点数 ^-([1-9]d*.d*|0.d*[1-9]d*)$ //匹配负浮点数 ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匹配浮点数 ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匹配⾮负浮点数(正浮点数 + 0) ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配⾮正浮点数(负浮点数 + 0) 评注:处理⼤量数据时有⽤,具体应⽤时注意修正 匹配特定字符串: ^[A-Za-z]+$ //匹配由26个英⽂字母组成的字符串 ^[A-Z]+$ //匹配由26个英⽂字母的⼤写组成的字符串 ^[a-z]+$ //匹配由26个英⽂字母的⼩写组成的字符串 ^[A-Za-z0-9]+$ //匹配由数字和26个英⽂字母组成的字符串 ^w+$ //匹配由数字、26个英⽂字母或者下划线组成的字符串 在使⽤RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下: 只能输⼊数字:“^[0-9]*$” 只能输⼊n位的数字:“^d{n}$” 只能输⼊⾄少n位数字:“^d{n,}$” 只能输⼊m-n位的数字:“^d{m,n}$” 只能输⼊零和⾮零开头的数字:“^(0|[1-9][0-9]*)$” 只能输⼊有两位⼩数的正实数:“^[0-9]+(.[0-9]{2})?$” 只能输⼊有1-3位⼩数的正实数:“^[0-9]+(.[0-9]{1,3})?$” 只能输⼊⾮零的正整数:“^+?[1-9][0-9]*$” 只能输⼊⾮零的负整数:“^-[1-9][0-9]*$” 只能输⼊长度为3的字符:“^.{3}$” 只能输⼊由26个英⽂字母组成的字符串:“^[A-Za-z]+$” 只能输⼊由26个⼤写英⽂字母组成的字符串:“^[A-Z]+$” 只能输⼊由26个⼩写英⽂字母组成的字符串:“^[a-z]+$” 只能输⼊由数字和26个英⽂字母组成的字符串:“^[A-Za-z0-9]+$” 只能输⼊由数字、26个英⽂字母或者下划线组成的字符串:“^w+$” 验证⽤户密码:“^[a-zA-Z]w{5,17}$”正确格式为:以字母开头,长度在6-18之间,只能包含字符、数字和下划线。
正则表达式150种表达方式

正则表达式150种表达方式1、删除所有数字。
只要查找:\d就OK。
为了不留空行:替换处:\d2、删除所有英文字母。
只要查找:\a就OK。
为了不留空行:替换处:\d3、删除除换行符以外的所有。
只要查找:. 为了不留空行:替换处:\d4、既删除英文字母又删除数字。
只要查找:\w。
为了不留空行:替换处:\d5、删除数字加字母加等于(如:3a=或3zz=)只要查找:\d+\a+\=。
为了不留空行:替换处:\d6、删除换行。
只要查找:$。
替换处:\d(还原查找:\a+=\f。
替换:\0\n)。
如在换行后加一空格,查找:(\a)$。
替换:\0 \d。
7、删除空行只要查找:^$。
为了不留空行:替换处:\d8、删除首尾空格。
只要查找:^\s*|\s*$就OK9、删除行前数字及顿号。
只要查找:\d+、替换为空10、删除末尾标点符号。
只要查找:\P+$|\P+\s+$,“|”前面是没有空格的,“|”后面有空格,P后的加是为了……而用的。
11、删除末尾空格。
只要查找:\s+$。
替换为空。
12、删除第一个字如:“的我们”中的“的”只要查找:^\的。
13、删除第几个字。
查找:查找:^().(.+)。
替换:\1\2。
去掉前面的拼音:查找:^\a+替换为空。
第一个括号里可加“.”且可变。
14、删含的。
查:.*的.*替:\d。
的头查:.*=的.*替:\d。
的尾查:\a.*\c.*的$替:\d(留它不匹配)●删非的行查:^[^的]+$替:\d15、删除几码以上的码查:^(...)...替:\1。
删第几位码。
查:^(...).(.+)替:\1\2(变成\1,\2则其位则改成,了)首括号的.可变。
16、删除各类型的几字词,但必须是码前词后或纯词。
三字词:查找:^\~f{}\f{3}$替换:\d。
替换:\d “3”可以改。
17、删除11字词及其以上的词条查找(自定义格式):\a{}\=(\c|\P|\p){11,}。
替换:\d。
11可改。
《正则表达式》课件

06
CATALOGUE
正则表达式的扩展与优化
正则表达式的扩展(如Unicode、命名组等)
Unicode支持
正则表达式内置了对Unicode字符集 的支持,可以使用诸如`uXXXX`的语 法来表示任意Unicode字符。
命名组
通过使用命名组,可以将匹配的子模 式进行有意义的命名,方便后续引用 和处理。
正则表达式在线测试工具是一种方便快捷的工具,用于测试 和验证正则表达式的正确性。通过在线测试工具,用户可以 输入正则表达式和测试字符串,并实时查看匹配结果,从而 快速定位问题并进行调整。
常用的正则表达式在线测试工具包括Regex101、RegExr、 RegexPal等。这些工具通常提供丰富的正则表达式语法高亮 显示、匹配模式选择、可视化匹配过程等功能,帮助用户更 好地理解和使用正则表达式。
字符串分割
总结词
正则表达式还可以用于字符串的分割操 作,将一个字符串按照特定的模式分割 成多个部分。
VS
详细描述
在字符串分割中,正则表达式可以用来将 一个字符串按照特定的模式分割成多个部 分。例如,可以使用正则表达式来将一个 包含逗号分隔的字符串分割成多个独立的 元素,或者将一个包含特定分隔符的字符 串分割成多个段落或行。
《正则表达式》 PPT课件
目录
• 正则表达式概述 • 正则表达式的语法规则 • 正则表达式的应用实例 • 正则表达式的常见问题与解决方案 • 正则表达式的工具与库 • 正则表达式的扩展与优化
01
CATALOGUE
正则表达式概述
什么是正则表达式
总结词
正则表达式是一种用于描述字符串中模式的强大工具。
04
CATALOGUE
正则表达式的常见问题与解决方案
常用正则表达式大全!(例如:匹配中文、匹配html)

具体的匹配中文及字符方法:/[\u4E00-\u9FA5\uF900-\uFA2D]/
说明: u4e00-u9fbf : unicode CJK(中日韩)统一表意字符。u9fa5后至u9fbf为空
匹配双字节字符(包括汉字在内):[^x00-xff]
匹配空行的正则表达式:n[s| ]*r
匹配HTML标记的正则表达式:/<(.*)>.*|<(.*) />/
匹配首尾空格的正则表达式:(^s*)|(s*$)
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
(5)应用:利用正则表达式限制网页表单里的文本框输入内容
用正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5]/g,'') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^u4E00-u9FA5]/g,''))"
用正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[W]/g,'') "onbeforepaste="clipboardData.setData(''text'',clipboardData.getData(''text'').replace(/[^d]/g,''
正则表达式

正则表达式(I)正则表达式是由英文词语regular expression翻译过来的,就是符合某种规则的表达式。
正则表达式在软件开发中应用非常广泛,例如,找出网页中的超链接,找出网页中的email 地址,找出网页中的手机号码,判断输入的内容是否全部是数字,是否满足某种日期格式等等。
可以将正则表达式理解为一种对文字进行模糊匹配的语言,它用一些特殊的符号(称为元字符)来代表具有某种特征的一组字符以及该组字符重复出现的次数。
例如,对于正则表达式“\d{5}(-\d{4})?”,\d就是一个元字符,它表示一个数字字,{5}表示紧靠它前面的元素项连续重复5次,\d和{5}的组合\d{5}就表示匹配任意连续的5个数字字符;-\d{4}匹配的是一个连字号(-)后加上4个任意的数字,(-\d{4})?表示连字号(-)和后面的4个数字可有可无。
对于整个正则表达式“\d{5}(-\d{4})?”,表示要么是5个连续的数字字符,要么是5个连续的数字后加上一个连字号(-)、再加上4个连续的数字组成的10个字符。
正则表达式中的圆括号除了能将多个元素组合成一个可统一操作的组合项外,它所括起来的表达式部分还成为了一个子匹配(也叫子表达式),也就是说,我们可以用圆括号在一个长的正则表达式中划分出子表达式。
这样,除了可以得到整个正则表达式的匹配结果外,还可以单独得到每个子表达式部分所匹配的结果。
要灵活运用正则表达式,必须了解其中各种元字符的功能。
元字符从功能上大致分为:限定符、选择匹配符、分组组合和反向引用符、特殊字符、字符匹配符、定位符。
限定符用于指定其前面的字符或组合项连续出现多少次,下面是各种限定符及其含义:●{n} 规定前面的元素或组合项的连续出现n 次●{n,} 规定前面的元素或组合项至少连续出现n 次●{n,m } 规定前面的元素或组合项至少连续出现n 次,至多连续出现m 次●+ 规定前面的元素或组合项必须出现一次或连续多次,等效于{1,}●* 规定前面的元素或组合项可以出现零次或连续多次,等效于{0,}●? 规定前面的元素或组合项出现零次或一次,等效于{0,1}默认情况下,正则表达式使用最长(也叫贪婪)匹配原则。
20个常用的正则表达式 单字母

正则表达式(Regular Expression)是一种用于匹配字符串的强大工具。
它通过使用特定的符号和字符来描述和匹配一系列字符串,能够满足我们在处理文本时的各种需求。
在这篇文章中,我们将深入探讨20个常用的单字母正则表达式,并通过实例来展示它们的使用方法。
1. \b在正则表达式中,\b表示单词的边界。
它可以用来匹配单词的开头或结尾,用于查找特定单词而不是单词的一部分。
2. \d\d表示任意一个数字字符。
它可以用来匹配任何数字,例如\d+可以匹配一个或多个数字字符。
3. \w\w表示任意一个字母、数字或下划线字符。
它可以用来匹配单词字符,例如\w+可以匹配一个或多个单词字符。
4. \s\s表示任意一个空白字符,包括空格、制表符、换行符等。
它可以用来匹配空白字符,例如\s+可以匹配一个或多个空白字符。
5. \.\.表示匹配任意一个字符,包括标点符号和空格等。
它可以用来匹配任意字符,例如\.可以匹配任意一个字符。
6. \A\A表示匹配字符串的开始。
它可以用来确保匹配发生在字符串的开头。
7. \Z\Z表示匹配字符串的结束。
它可以用来确保匹配发生在字符串的结尾。
8. \b\b表示单词的边界。
它可以用来匹配单词的开头或结尾,用于查找特定单词而不是单词的一部分。
9. \D\D表示任意一个非数字字符。
它可以用来匹配任何非数字字符。
10. \W\W表示任意一个非单词字符。
它可以用来匹配任何非单词字符。
11. \S\S表示任意一个非空白字符。
它可以用来匹配任何非空白字符。
12. \[\[表示匹配方括号。
它可以用来匹配包含在方括号内的字符。
13. \]\]表示匹配方括号。
它可以用来匹配包含在方括号内的字符。
14. \(\(表示匹配左括号。
它可以用来匹配包含在左括号内的字符。
15. \)\)表示匹配右括号。
它可以用来匹配包含在右括号内的字符。
16. \{\{表示匹配左花括号。
它可以用来匹配包含在左花括号内的字符。
17. \}\}表示匹配右花括号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、正则表达式简介在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。
在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。
许多程序设计语言都支持利用正则表达式进行字符串操作。
例如,在Perl中就内建了一个功能强大的正则表达式引擎。
正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。
正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
编辑本段二、正则表达式的历史和起源正则表达式的“鼻祖”或许可一直追溯到科学家对人类神经系统工作原理的早期研究。
美国新泽西州的Warren McCulloch和出生在美国底特律的Walter Pitts这两位神经生理方面的科学家,研究出了一种用数学方式来描述神经网络的新方法,他们创新地将神经系统中的神经元描述成了小而简单的自动控制元,从而作出了一项伟大的工作革新。
在1956 年,出生在被马克·吐温(Mark Twain)称为“美国最美丽的城市之一的”哈特福德市的一位名叫Stephen Kleene的数学科学家,他在Warren McCulloch和Walter Pitts早期工作的基础之上,发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。
正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。
之后一段时间,人们发现可以将这一工作成果应用于其他方面。
Ken Thompson就把这一成果应用于计算搜索算法的一些早期研究,Ken Thompson是 Unix的主要发明人,也就是大名鼎鼎的Unix之父。
Unix之父将此符号系统引入编辑器QED,然后是Unix上的编辑器ed,并最终引入grep。
Jeffrey Friedl 在其著作“Mastering Regular Expressions (2nd edition)”中对此作了进一步阐述讲解,如果你希望更多了解正则表达式理论和历史,推荐你看看这本书。
自此以后,正则表达式被广泛地应用到各种UNIX或类似于UNIX的工具中,如大家熟知的Perl。
Perl的正则表达式源自于Henry Spencer编写的regex,之后已演化成了pcre(Perl兼容正则表达式Perl Compatible Regular Expressions),pcre是一个由Philip Hazel开发的、为很多现代工具所使用的库。
正则表达式的第一个实用应用程序即为Unix中的 qed 编辑器。
然后,正则表达式在各种计算机语言或各种应用领域得到了广大的应用和发展,演变成为目前计算机技术森林中的一只形神美丽且声音动听的百灵鸟。
以上是关于正则表达式的起源和发展的历史描述,到目前正则表达式在基于文本的编辑器和搜索工具中依然占据这一个非常重要的地位。
在最近的六十年中,正则表达式逐渐从模糊而深奥的数学概念,发展成为在计算机各类工具和软件包应用中的主要功能。
不仅仅众多UNIX工具支持正则表达式,近二十年来,在WINDOW的阵营下,正则表达式的思想和应用在大部分 Windows 开发者工具包中得到支持和嵌入应用!从正则式在Microsoft Visual Basic 6 或 Microsoft VBScript 到.NET Framework中的探索和发展,WINDOWS系列产品对正则表达式的支持发展到无与伦比的高度,目前几乎所有 Microsoft 开发者和所有.NET语言都可以使用正则表达式。
如果你是一位接触计算机语言的工作者,那么你会在主流操作系统(*nix[Linux, Unix 等]、Windws、HP、BeOS等)、目前主流的开发语言(PHP、C#、Java、C++、VB、Javascript、Rubby等)、数以亿万计的各种应用软件中,都可以看到正则表达式优美的舞姿。
[1]编辑本段三、正则表达式的概念一个正则表达式,就是用某种模式去匹配一类字符串的一个公式。
很多人因为它们看上去比较古怪而且复杂所以不敢去使用——很不幸,这篇文章也不能够改变这一点,中级的例子例1将所有方法foo(a,b,c)的实例改为foo(b,a,c)。
这里a、b和c可以是任何提供给方法foo()的参数。
也就是说我们要实现这样的转换:之前之后foo(10,7,2) foo(7,10,2)foo(x+13,y-2,10) foo(y-2,x+13,10)foo( bar(8), x+y+z, 5) foo( x+y+z, bar(8), 5)下面这条替换命令能够实现这一魔法::%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g现在让我们把它打散来加以分析。
写出这个表达式的基本思路是找出foo()和它的括号中的三个参数的位置。
第一个参数是用这个表达式来识别的::\([^,]*\),我们可以从里向外来分析它:[^,] 除了逗号之外的任何字符[^,]* 0或者多个非逗号字符\([^,]*\) 将这些非逗号字符标记为\1,这样可以在之后的替换模式表达式中引用它\([^,]*\), 我们必须找到0或者多个非逗号字符后面跟着一个逗号,并且非逗号字符那部分要标记出来以备后用。
现在正是指出一个使用正则表达式常见错误的最佳时机。
为什么我们要使用[^,]*这样的一个表达式,而不是更加简单直接的写法,例如:.*,来匹配第一个参数呢?设想我们使用模式.*来匹配字符串"10,7,2",它应该匹配"10,"还是"10,7,"?为了解决这个两义性(ambiguity),正则表达式规定一律按照最长的串来,在上面的例子中就是"10,7,",显然这样就找出了两个参数而不是我们期望的一个。
所以,我们要使用[^,]*来强制取出第一个逗号之前的部分。
这个表达式我们已经分析到了:foo(\([^,]*\),这一段可以简单的翻译为“当你找到foo(就把其后直到第一个逗号之前的部分标记为\1”。
然后我们使用同样的办法标记第二个参数为\2。
对第三个参数的标记方法也是一样,只是我们要搜索所有的字符直到右括号。
我们并没有必要去搜索第三个参数,因为我们不需要调整它的位置,但是这样的模式能够保证我们只去替换那些有三个参数的foo()方法调用,在foo()是一个重载(overoading)方法时这种明确的模式往往是比较保险的。
然后,在替换部分,我们找到foo()的对应实例,然后利用标记好的部分进行替换,是的第一和第二个参数交换位置。
例2假设有一个CSV(comma separated value)文件,里面有一些我们需要的信息,但是格式却有问题,目前数据的列顺序是:姓名,公司名,州名缩写,邮政编码,现在我们希望讲这些数据重新组织,以便在我们的某个软件中使用,需要的格式为:姓名,州名缩写-邮政编码,公司名。
也就是说,我们要调整列顺序,还要合并两个列来构成一个新列。
另外,我们的软件不能接受逗号前后面有任何空格(包括空格和制表符)所以我们还必须要去掉逗号前后的所有空格。
这里有几行我们现在的数据:Bill Jones, HI-TEK Corporation , CA, 95011Sharon Lee Smith, Design Works Incorporated, CA, 95012B. Amos , Hill Street Cafe, CA, 95013Alexander Weatherworth, The Crafts Store, CA, 95014...我们希望把它变成这个样子:Bill Jones,CA 95011,HI-TEK CorporationSharon Lee Smith,CA 95012,Design Works IncorporatedB. Amos,CA 95013,Hill Street CafeAlexander Weatherworth,CA 95014,The Crafts Store...我们将用两个正则表达式来解决这个问题。
第一个移动列和合并列,第二个用来去掉空格。
下面就是第一个替换命令::%s/\([^,]*\),\([^,]*\),\([^,]*\),\(.*\)/\1,\3 \4,\2/这里的方法跟例1基本一样,第一个列(姓名)用这个表达式来匹配:\([^,]*\),即第一个逗号之前的所有字符,而姓名内容被用\1标记下来。
公司名和州名缩写字段用同样的方法标记为\2和\3,而最后一个字段用\(.*\)来匹配("匹配所有字符直到行末")。
替换部分则引用上面标记的那些内容来进行构造。
下面这个替换命令则用来去除空格::%s/[ \t]*,[ \t]*/,/g我们还是分解来看:[ \t]匹配空格/制表符,[ \t]* 匹配0或多个空格/制表符,[ \t]*,匹配0或多个空格/制表符后面再加一个逗号,最后,[ \t]*,[ \t]*匹配0或多个空格/制表符接着一个逗号再接着0或多个空格/制表符。
在替换部分,我们简单的我们找到的所有东西替换成一个逗号。
这里我们使用了结尾的可选的g参数,这表示在每行中对所有匹配的串执行替换(而不是缺省的只替换第一个匹配串)。
例3假设有一个多字符的片断重复出现,例如:Billy tried really hardSally tried really really hardTimmy tried really really really hardJohnny tried really really really really hard而你想把"really"、"really really",以及任意数量连续出现的"really"字符串换成一个简单的"very"(simple is good!),那么以下命令::%s/\(really \)\(really \)*/very /就会把上述的文本变成:Billy tried very hardegrepvi替换命令简介Vi的替换命令::ranges/pat1/pat2/g其中: 这是Vi的命令执行界面。
range 是命令执行范围的指定,可以使用百分号(%)表示所有行,使用点(.)表示当前行,使用美元符号($)表示最后一行。
你还可以使用行号,例如10,20表示第10到20行,.,$表示当前行到最后一行,.+2,$-5表示当前行后两行直到全文的倒数第五行,等等。