正则表达式生成器匹配字符串

正则表达式模式匹配字符串基础知识
&更新时间:日 11:52:45 & 作者:Navono
这篇文章主要介绍了正则表达式模式匹配字符串基础知识,分为匹配字符串的基本规则和正则匹配、查找与替代的知识,本文给大家介绍的非常不错,需要的朋友可以参考下
&&&&& 在实际项目中有个功能的实现需要解析一些特定模式的字符串。而在已有的代码库中,在已实现的部分功能中,都是使用检测特定的字符,使用这种方法的缺点是:
逻辑上很容易出错
很容易漏掉对一些边界条件的检查
代码复杂难以理解、维护
&&&&& 看到代码库中有一个cpp,整个cpp两千多行代码,有个方法里,光解析字符串的就有400余行!一个个字符对比过去,真是不堪入目。而且上面很多注释都已经过期,很多代码的书写风格也各不相同,基本可以判断是过了很多人手的。
&&&&& 在这种情况下,基本没办法还沿着这条老路走下去,自然而然就想到了使用正则表达式。而我自己在正则表达式方面没有实际应用的经验,尤其是对于书写匹配规则也是一知半解。第一时间就想到从网上找点资料,先大致了解下。但是度娘的结果依旧还是让人很失望。(当然,如果是想要查找一些比较专业的知识,度娘的结果每次都会让人心碎,无不都是千篇一律的拷贝。但是通常度娘生活方面的还是可以)后来就放弃度娘的查询结果,FQ到了外面去找,也找到了一些比较基础的视频(需FQ)。
&&&&& 这篇文章可以说是一个总结,把在书写正则表达式的匹配字符串方面的基础知识介绍一下。主要分为以下两个个部分:
匹配字符串的基本规则
正则匹配、查找与替代
本文介绍的正则表达式规则是ECMAScript。使用的编程语言是C++。其他方面的不做介绍。
匹配字符串的基本规则
1. 匹配固定的字符串
regex e("abc");
2. 匹配固定字符串,不区分大小写
regex e("abc", regex_constants::icase);
3. 匹配固定字符串之外多一个字符,不区分大小写
regex e("abc.", regex_constants::icase);&&// .& Any character except newline. 1个字符
4. 匹配0个或1个字符
regex e("abc?");&&&&// ?&&Zero or 1 preceding character. 匹配?前一个字符
5. 匹配0个或多个字符
regex e("abc*");&&&&// *&&Zero or more preceding character. 匹配*前一个字符
6. 匹配1个或多个字符
regex e("abc+");&&&&// +&&One or more preceding character. 匹配+前一个字符
7. 匹配特定字符串中的字符
regex e("ab[cd]*");&&&&// [...]&Any character inside square brackets. 匹配[]内的任意字符
8. 匹配非特定字符串的字符
regex e("ab[^cd]*");&&&&// [...]&Any character not inside square brackets. 匹配非[]内的任意字符
9. 匹配特定字符串,且指定数量
regex e("ab[cd]{3}");&&&&// {n}&&匹配{}之前任意字符,且字符个数为3个
10. 匹配特定字符串,指定数量范围
regex e("ab[cd]{3,}");
// {n} 匹配{}之前任意字符,且字符个数为3个或3个以上
regex e("ab[cd]{3,5}");
// {n} 匹配{}之前任意字符,且字符个数为3个以上,5个以下闭区间
11. 匹配规则中的某一个规则
regex e("abc|de[fg]");&&&&// |&&匹配|两边的任意一个规则
12. 匹配分组
regex e("(abc)de+");&&&&// ()&&&&&& ()表示一个子分组
13. 匹配子分组
regex e("(abc)de+\\1");
()表示一个子分组,而\1表示在此位置匹配第一个分组的内容
regex e("(abc)c(de+)\\2\\1");
// \2 表示的是在此匹配第二个分组的内容
14. 匹配某个字符串开头
regex e("^abc.");
// ^ begin of the string 查找以abc开头的子字符串
15. 匹配某个字符串结尾
regex e("abc.$");
// $ end of the string 查找以abc结尾的子字符串
&&&&& 以上是最基本的匹配模式的书写。通常如果要匹配特定的字符,需要使用\进行转义,比如在匹配字符串中需要匹配".",那么在匹配字符串中应该在特定字符前加上\。出了以上的基本规则,如果还不满足特定的需要,那么可以参考此链接。使用了解基本的匹配模式后,需要使用正则表达式进行匹配、查找或者替代。
正则匹配、查找与替代
&&&&& 书写好模式字符串后,需要将待匹配的字符串和模式字符串进行一定规则的匹配。包括三种方式:匹配(regex_match)、查找(regex_search)、替换(regex_replace)。
&&&&& 匹配很简单,直接将待匹配字符串和模式字符串传入到regex_match中,返回一个bool量来指明待匹配的字符串是否满足模式字符串的规则。匹配整个str字符串。
bool match = regex_match(str, e);
// 匹配整个字符串str
&&&&& 查找是在整个字符串中找到和满足模式字符串的子字符串。也就是只要str中存在满足模式字符串就会返回true。
bool match = regex_search(str, e);
// 查找字符串str中匹配e规则的子字符串
&&&&& 但是很多情况下,光是返回一个是否匹配的bool量是不够的,我们需要拿到匹配的子字符串。那么就需要在模式字符串中将匹配字符串分组,参考【匹配字符串的基本规则】第12点。再将smatch传入到regex_search中,就可以获得满足每个子分组的字符串。
bool found = regex_search(str, m, e);
for (int n = 0; n & m.size(); ++n)
cout && "m[" && n && "].str()=" && m[n].str() &&
&&& 替换也是基于模式字符串在分组情况下完成的。
cout && regex_replace(str, e, "$1 is on $2");
&&&&& 此时,会在满足分组1和分组2的字符串中间加上“ is on”。
&&&&& 以上三个函数有很多版本的重载,可以满足不同情况下的需求。
&&&&& 要求:找出满足sectionA("sectionB")或者sectionA ("sectionB")的模式字符串。且分离出sectionA、sectionB。sectionA和sectionB不会出现数字,字符可大小写,至少有一个字符。
&&&&& 分析:根据要求,大致可分为两个部分,也就是sectionA和sectionaB。这是就需要用到分组。
第一步:写出满足section情况的模式字符串
第二步:在sectionA和sectionB中可能会出现空格。暂且假设至多有1个空格
将以上两个情况组合起来,也就是能满足我们需求的模式字符串。但是如何组织才能让其分为两组呢?
[a-zA-Z]+\\s[a-zA-Z]+
上面这种写法肯定不对的,根据分组规则,需要将分组以()进行区分
regex e("([a-zA-Z]+)\\s?\\(\"([a-zA-Z]+)\"\\)");
&&&&& 此时,在?后面的"是为了满足sectionB外层的引号和括号进行的转义。
&&&&& 以上完成后,可先用regex_match进行匹配,如果匹配,那么继续使用regex_search对字符串进行查找
if (regex_match(str, e))
auto found = regex_search(str, m, e);
for (int n = 0; n & m.size(); ++n)
cout && "m[" && n && "].str()=" && m[n].str() &&
cout && "Not matched" &&
&&&&& 对象m数组的第一个字符串是满足需求的整个子串,接下来才是满足分组1、分组2的子串。
以上所述是小编给大家介绍的正则表达式模式匹配字符串基础知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具开源中国在线工具
在线正则表达式测试
正则表达式
忽略大小写
匹配结果:
替换结果:
在此填写您的意见信息:
Email邮箱: (必填)
您的建议和意见:求一个正则
字符串中以a开始 以b结束的字符串正则表达式
[问题点数:40分,结帖人Sunhk_25]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:0
本版专家分:52883
2018年7月 VB大版内专家分月排行榜第一2018年6月 VB大版内专家分月排行榜第一2018年5月 VB大版内专家分月排行榜第一2018年4月 VB大版内专家分月排行榜第一2018年3月 VB大版内专家分月排行榜第一2018年2月 VB大版内专家分月排行榜第一2018年1月 VB大版内专家分月排行榜第一2017年9月 VB大版内专家分月排行榜第一2017年8月 VB大版内专家分月排行榜第一2017年7月 VB大版内专家分月排行榜第一2017年6月 VB大版内专家分月排行榜第一2017年5月 VB大版内专家分月排行榜第一2017年4月 VB大版内专家分月排行榜第一2016年11月 VB大版内专家分月排行榜第一2016年8月 VB大版内专家分月排行榜第一2016年7月 VB大版内专家分月排行榜第一2013年12月 VB大版内专家分月排行榜第一2013年10月 VB大版内专家分月排行榜第一2013年9月 VB大版内专家分月排行榜第一2008年5月 VB大版内专家分月排行榜第一
2017年12月 VB大版内专家分月排行榜第二2017年11月 VB大版内专家分月排行榜第二2017年3月 VB大版内专家分月排行榜第二2016年12月 VB大版内专家分月排行榜第二2016年10月 VB大版内专家分月排行榜第二2013年11月 VB大版内专家分月排行榜第二
2016年3月 VB大版内专家分月排行榜第三2012年9月 VB大版内专家分月排行榜第三
本版专家分:28776
2011年10月 VB大版内专家分月排行榜第二2011年3月 VB大版内专家分月排行榜第二2011年2月 VB大版内专家分月排行榜第二
2011年5月 VB大版内专家分月排行榜第三2011年4月 VB大版内专家分月排行榜第三
本版专家分:28776
2011年10月 VB大版内专家分月排行榜第二2011年3月 VB大版内专家分月排行榜第二2011年2月 VB大版内专家分月排行榜第二
2011年5月 VB大版内专家分月排行榜第三2011年4月 VB大版内专家分月排行榜第三
本版专家分:1486
本版专家分:40268
2017年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本版专家分:8451
2017年4月 其他数据库开发大版内专家分月排行榜第二
2008年11月 VB大版内专家分月排行榜第三
匿名用户不能发表回复!
其他相关推荐正则表达式模式匹配的String方法
&更新时间:日 09:00:05 & 作者:_燎原之火
这篇文章主要介绍了正则表达式模式匹配的String方法 的相关资料,需要的朋友可以参考下
在JavaScript代码中使用正则表达式进行模式匹配经常会用到String对象和RegExp对象的一些方法,例如replace、match、search等方法,以下是对一些方法使用的总结。
String对象中支持正则表达式有4种方法,分别是:search、replace、match、split
str.search(regexp)
定义:search()方法将在字符串str中检索与表达式regexp相匹配的字串,并且返回第一个匹配字串的第一个字符的位置。如果没有找到任何匹配的字串,则返回-1。
var str = "Javascript";
str.search(/script/); // 返回 script 中s的位置为 4
str.search(/j/i); // 设置正则表达是标识i:忽略大小写,则匹配到J,返回位置0
但是,search()方法不支持全局搜索,因为会忽略正则表达式参数的标识g,并且也忽略了regexp的lastIndex属性,总是从字符串的开始位置进行检索,所以它会总是返回str的第一个匹配的位置。
var str = "javascript is cool";
str.search(/s/g); // 返回 javascript 中的s位置4,不会继续检索s
str.replace(regexp, replacement)
定义:replace()方法是执行查找并替换的操作。它将正则表达式regexp匹配到的字串,然后用replacement的字符串替换掉字串,如果有全局标识g,则替换全部匹配的字串,否则只替换第一个匹配字串。
replace方法应该是比较常用的一个方法,在字符串替换操作中非常有用的。例如:
1、简单替换
var str = "javascript";
str.replace(/javascript/,'JavaScript'); // 将字符串javascript替换为JavaScript
2、全局替换
// 使用全局表示g进行全局替换
var str = "javascript";
str.replace(/a/g, 'b'); // 将所有的字母a替换为字母b,返回 jbvbscript
3、使用replacement中的特殊字符替换,在replacement中$字符有特殊的意义,具体说明如下表格:
$1、$2、...、$99
与regexp中的第1个到99 个子表达式相匹配的文本
与regexp相匹配的字串
位于匹配子串左侧的文本
位于匹配子串右侧的文本
直接量符号
来看下例子:
//1、用子表达式替换:$1、$2等
var str = "javascript";
str.replace(/(java)(script)/,'$2$1');
// 表达式中()就是一个子表达式,$1对应是第一个表达式的内容,即java,$2为script,所以替换结果为:scriptjava
//2、$& 为正值表达式匹配的字串
var str = "javascript";
str.replace(/java/,'$&-');
// 正则表达式通过直接量java来匹配,匹配结果为java,则 $&的值为java,然后用字符串$&-来替换匹配的字串,结果为java-script
// 3、 $` $' $$
var str = "javascript";
str.replace(/ava/,"$`"); // $`为匹配子串ava的左侧文本,则为j,则替换后ava的结果为:jjscript
str.replace(/ava/,"$'"); // $'为匹配子串ava的右侧文本,则为script,则替换ava的结果为:jscriptscript
str.replace(/ava/,"$$"); // $$为直接量符号,即插入一个$符号,替换结果为:j$script
4、使用replacement作为函数替换
replace的参数replacement可以是函数而不是字符串,每个匹配都会调用该函数,它返回的字符串将作为替换的文本使用。该函数的第一个参数是整个匹配模式的字符串,接下来的参数是与模式中的子表达式匹配的字符串,可以有0个或多个参数。接下来的参数是一个整数,声明了匹配在str中出现的位置。最后的参数是str自身。
来看个例子:
// match 为匹配整个字符串,即:'abc12345#$*%'
// p1 为第一个子表达式,([^\d]*),匹配0个或多个非数字的字符,即:abc
// p2 为第二个子表达式,(\d*),匹配0个或多个的数字,即:12345
// p3 为第三个子表达式,([^\w]*),匹配0个或匹配任何非单词字符。等价于 '[^A-Za-z0-9_]',即 #$*%
// offset 为模式匹配出现的位置,从第一个字符已经匹配成功,则位置为0
// string为字符串本身,即 abc12345#$*%
function replacer(match, p1, p2, p3, offset, string) {
return [p1, p2, p3].join(' - ');
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
// 替换结果为:abc - 12345 - #$*%
str.match(regexp)
定义:match()方法是最常用的String正则表达式方法。它唯一的参数就是一个正则表达式或者通过RegExp()构造函数来创建正则表达式,返回值是包含了匹配结果的数组。
match()方法中的regexp正则表达式一般又分为两种情况:有设置全局标志g和没有设置全局标志g
1、有设置全局标志
如果设置了全局标志g,则返回的数组包含的就是出现在字符串的所有匹配结果,例如:
// 全局匹配
var str = "1 plus 2 equals 3";
str.match(/\d/g); // 匹配字符串中出现的所有数字,并返回一个数组: [1,2,3]
2、没有设置全局标志
如果没有设置全局标志,则就不是全局性的检索,只是检索第一个匹配。这种情况下,match()方法匹配的结果也是返回一个数组,数组的第一个元素就是匹配的字符串,而余下的元素则是正则表达式中用括号括起来的子表达式。来看个例子:
// 非全局匹配
var str = "visit my blog at http://www.example.com";
str.match(/(\w+):\/\/([\w.]+)/); // 返回结果:["http://www.example.com", "http", "www.example.com"]
// 正则表达式匹配的结果为:http://www.example.com
// 第一个子表达式 (\w+)匹配结果:http
// 第二个子表达式 ([\w.])匹配结果: www.example.com
str.split(delimiter, limit)
定义:split()方法可以把调用它的字符串分解为一个字串数组,使用的分隔符是它的参数。
delimiter:字符串或者正则表达式,从该参数指定的地方分割字符串。
limit:指定返回数组的最大长度,如果没有设置该参数,则整个字符串都会被分割。
//1、 只传一个参数,默认分割整个字符串
var str ="a,b,c,d,e";
str.split(','); // 返回分割的字符串数组:["a", "b", "c", "d", "e"]
//2、传入两个参数
var str ="a,b,c,d,e";
str.split(',',3); //指定限定长度,则返回对应的数组:["a", "b", "c"]
//3、使用正则表达式匹配,不包含分割字符串
var str = "aa44bb55cc66dd";
str.split(/\d+/); //通过匹配数字进行分割字符串,但不包含分割的字符串,则返回的结果为:["aa","bb","cc","dd"];
//4、使用正则表达式匹配,包含分割字符串
var str = "aa44bb55cc66dd";
str.split(/(\d+)/); //通过匹配数字进行分割字符串,且分割的字符串是包含在子表达式中,则返回的结果为:["aa", "44", "bb", "55", "cc", "66", "dd"]
关于正则表达式模式匹配的String方法的相关知识,小编就给大家介绍到这里,希望对大家有所帮助!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 正则表达式生成器 的文章

 

随机推荐