保藏本站 保藏本站
真钱棋牌网主页 - 软件测验 - 常用手册 - 站长东西 - 技能社区
主页 > 正则表达式 > 正文

主页 - PHP - 数据库 - 操作体系 - 游戏开发 - JS - Android - MySql - Redis - MongoDB - Win8 - Shell编程 - DOS指令 - jQuery - CSS款式 - Python - Perl

Access - Oracle - DB2 - SQLServer - MsSql2008 - MsSql2005 - Sqlite - PostgreSQL - node.js - extjs - JavaScript vbs - Powershell - Ruby

正则表达式形式匹配字符串根底常识

介绍

在实践项目中有个功用的完结需求解析一些特定形式的字符串。而在已有的代码库中,在已完结的部分功用中,都是运用检测特定的字符,运用这种办法的缺陷是:

逻辑上很简单犯错 很简单漏掉对一些边界条件的检查 代码杂乱难以了解、保护 功能差

看到代码库中有一个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中,就能够取得满意每个子分组的字符串。

smatch m;
bool found = regex_search(str, m, e);
for (int n = 0; n < m.size(); ++n)
  {
    cout << "m[" << n << "].str()=" << m[n].str() << endl;
  }

替换也是依据形式字符串在分组状况下完结的。

cout << regex_replace(str, e, "$1 is on $2");

此刻,会在满意分组1和分组2的字符串中心加上“ is on”。

以上三个函数有许多版别的重载,能够满意不同状况下的需求。

实战

要求:找出满意sectionA("sectionB")或许sectionA ("sectionB")的形式字符串。且别离出sectionA、sectionB。sectionA和sectionB不会呈现数字,字符可大小写,至少有一个字符。

剖析:依据要求,大致可分为两个部分,也便是sectionA和sectionaB。这是就需求用到分组。

第一步:写出满意section状况的形式字符串

[a-zA-Z]+

第二步:在sectionA和sectionB中可能会呈现空格。暂时假定至多有1个空格

\s?

将以上两个状况组合起来,也便是能满意咱们需求的形式字符串。可是怎样安排才能让其分为两组呢?

[a-zA-Z]+\s[a-zA-Z]+

上面这种写法必定不对的,依据分组规矩,需求将分组以()进行区别

regex e("([a-zA-Z]+)\s?\("([a-zA-Z]+)"\)");

此刻,在\s?后边的\("是为了满意sectionB外层的引号和括号进行的转义。

以上完结后,可先用regex_match进行匹配,假如匹配,那么持续运用regex_search对字符串进行查找

if (regex_match(str, e))
{
 smatch m;
 auto found = regex_search(str, m, e);
 for (int n = 0; n < m.size(); ++n)
 {
 cout << "m[" << n << "].str()=" << m[n].str() << endl;
 }
}
else
{
 cout << "Not matched" << endl;
}

目标m数组的第一个字符串是满意需求的整个子串,接下来才是满意分组1、分组2的子串。

总结

以上所述是小编给我们介绍的正则表达式形式匹配字符串根底常识,期望对我们有所协助,假如我们有任何疑问请给我留言,小编会及时回复我们的。在此也非常感谢我们对真钱棋牌网网站的支撑!

python 正则表达式 re.sub & re.subn
python正则表达式模块简介Python自1.5版别起增加了re模块,它供给Perl风格的正则表达式形式。Python1.5之前版别则是经过regex模块供给Emacs风格的形式。Emacs

mysql update正则替换sql句子
下面的update句子履行的是把www.test.com中的test替换为abc程序代码例句:UpdatetestSETurl=REPLACE('www.test.com','test','abc')WhereurlREGEXPwww.test.com;假如在记载中,有类

MySQL中REGEXP正则表达式运用大全
曾经我要查找数据都是运用like后来发现mysql中也有正则表达式了而且感觉功能要好于like,下面我来给我们共享一下mysqlREGEXP正则表达式运用详解,期望

本周排行

更新排行

强悍的草根IT技能社区,这儿应该有您想要的! 友情链接:b2b电子商务
Copyright © 2010 ystekkfj.com. All Rights Rreserved  京ICP备05050695号