正则表达式使用学习(C++、Qt、Python)

53 篇文章 6 订阅
22 篇文章 4 订阅

写在前面

个人对于正则表达式实在是不太了解,所以本文内容纰漏应该会比较多。只希望不会对大家造成误导。

本文只是简单涉及C++0x、Qt4、Python3、Vim中的正则表达式:

  • C++0x :在 regexp 头文件中提供一系列模板类

  • Qt4 :中提供了 QRegExp 类

  • Python3 :中提供了 re 模块

  • Vim :命令模式和脚本支持正则

晕,写了一上午,竟然写成了这样了,Vim竟然都没涉及,其他部分也是一团糟,额,本来是想整理它们之间的在pattern上的区别的。不管了,先这样吧。

2011.08.20

用途

两个问题+三个动作?(真不知道该如何分类了...):

  • match: 字符串匹配这个模式(pattern)么?

  • search: 字符串中存在和模式匹配的字串么?

  • capture: 捕获匹配的字符串

  • replace: 替换字符串(子串)

  • split: 分割字符串

使用

准备pattern字符串

这个?元字符、匹配单个字符、重复匹配等,似乎相关的资料太多了哈,这儿暂时省略。

Python提供raw字符串的字面量写法,C++0x也提供了这种功能,只是编译器目前似乎都尚不支持。

//C++0x
const char * str1 = "C://windows//system32";
const char * str2 = R"(C/windows/system32)";

生成pattern对象

Python

re.compile(pattern, flags=0)生成对象

Qt

使用QRegExp构造函数,可通过QRegExp::setPattern()修改

C++0x

通过模板类basic_regex构造

Python 下面,通过 re.compile() 可以生成一个正则表达式对象(Regular Expression Objects)

>>> import re
>>> re.compile(r"dbzhang8\d{2}")
<_sre.SRE_Pattern object at 0xb731c720>
>>> 
  • 如果稍后只是使用re模块级的函数,比如re.match(r"dbzhang8\d{2}", "dbzhang800"),那么不必先使用compile生成正则表达式对象。

C++0x 和 Qt 下,直接使用构造函数生成对象

QRegExp qt_pattern("dbzhang8\\d{2}");
std::regex cpp_pattern("dbzhang8\\d{2}");
  • 在C++0x中,有char,wchar_t,char16_t,char32_t 这4种字符类型,std::regex 只是一个别名 typedef basic_regex<char> regex;

执行匹配操作

看看Python

match()

判断RE是否从字符串“开头”开始匹配

成功则返回一个MatchObject对象,否则返回None

这4个函数均有模块级 和 对象的成员函数两种形式。区别在于后者需要先编译一个正则表达式对象,该对象可以重复使用。

search()

扫描字符串,看是否有匹配的字串

findall()

查找所有匹配的字串,将它们作为一个list返回

 

finditer()

查找所有匹配的字串,将它们以迭代器(iterator)返回

 
  • 简单的例子:
    >>> p = re.compile(r"dbzhang8\d{2}")
    >>> print(p.match("dbzhang-800"))
    None
    >>> p.match("dbzhang801")
    <_sre.SRE_Match object at 0xb71d3fa8>
    >>> p.findall("dbzhang801dbzhang802")
    ['dbzhang801', 'dbzhang802']

    注意:MatchObject包含匹配信息,可以用来提取匹配的字符串

看看Qt

QRegExp::exactMatch()

判断字符串是否完全(从头到尾)匹配,返回真或假

这3个操作都会设置 matchedLength()、capturedTexts()、pos()的信息,类似于前面python中的MatchObject

QRegExp::indexIn()

搜索字符串以找到匹配的字串,返回索引值,失败返回-1

QRegExp::lastIndexIn()

同上,只是从后向前搜索

QString::indexOf()

 

如果只是查找的话,这两个更方便,只是无法获取额外的capturedTexts等信息了

QString::contains()

是否匹配

QString::count()

多少次匹配

恩,看看C++0x

regex_match()

表达式是否完整匹配一个字符串?

返回值是布尔量,但执行时会填充一个match_results对象,以用来进行字串捕捉。注意:这些是算法,不是前面提到的basic_regex的成员函数。

regex_search()

是否匹配字符串的一部分?

看看Capture信息?

要Capture字串的话,正则的pattern需要使用圆括号“()”包住一部分。

前面看到,match、search、index、... 等操作,都会通过其他方式填充一些额外的信息

  • Python 中生成一个 MatchObject 对象

  • C++ 0x 填充 match_result 对象
  • Qt 通过QRegExp对象自身 matchedLength()、capturedTexts()、pos() 的成员函数

Python

group()

返回匹配的字符串

需指定哪一个(或哪几个)组,默认是0组(匹配自身)

start()

返回匹配的起始位置

end()

返回匹配的结束位置

span()

返回包含起始和结束位置的元组(tuple)

groups()

返回所有匹配的组

 

Qt 中:

matchedLength()

匹配的长度

 

captureCount()

表达式中含有的捕捉组的数目

 

capturedTexts()

捕捉到的字符串列表

pos(int n)

第n个组的位置

cap(int n)

第n个组的内容(0代表匹配自身)

C++0x 中:

match_results::operator[](size_type n)

返回第n个捕捉组(0代表匹配自身)

返回的是sub_match模板类的对象

match_results::prefix()

返回被匹配子串前面的串

match_results::suffix()

返回被匹配子串后面的串

match_results::empty()

只在匹配失败是返回true

 

match_results::size()

组的数目

 

match_results::str()

组的内容

 

match_results::position()

位置

 
  • 4个别名:
    typedef match_results<const char*> cmatch;
    typedef match_results<const wchar_t*> wcmatch;
    typedef match_results<string::const_iterator> smatch;
    typedef match_results<wstring::const_iterator> wsmatch;

执行修改操作

Python

split()

分割字符串

可指定最大分割或替代的数目

sub()

替换所有匹配的子串

subn()

同上,但同时返回多少次替换发生(返回的是元组)

Qt中:

QString::split()

全是QString的成员函数,简单明了

QString::section()

QString::replace()

QString::remove()

C++0x中:

regex_replace()

就这一个么?呵呵

参考

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
c++/qt写的项目,可供自己学习,项目都经测试过,真实可靠,请放心使用Qt支持 Windows、Linux/Unix、Mac OS X、Android、BlackBerry、QNX等多种平台,并为这些不同的平台提供了统一的开发环境。 面向对象 C++是完全面向对象的,这一点和Objective-c等在开发很相似。而Qt又是基于C++一种语言的扩展,大家都知道C++ 有快速、简易、面向对象等很多优点,所以Qt自然也继承者C++这些的优点。 Qt良好的封装机制使得Qt的模块化程度非常高,可重用性较好,对用户开发来货是非常方便的。Qt提供一种为signals/slots(信号和槽) 的安全类型来替代callback,使得各个元件之间的协同工作变得十分简单。 丰富的API Qt包括多达 250 个以上的 C++ 类,还提供基于模板的 collections, serialization, file, I/Odevice, directory management, date/time 类。甚至还包括正则表达式的处理功能。 支持 2D/3D 图形渲染,支持 OpenGL。 大量的开发文档。 XML支持 Webkit 引擎的集成,可以实现本地界面与Web内容的无缝集成, 但是真正使得 Qt 在自由软件界的众多 Widgets (如 Lesstif,Gtk,EZWGL,Xforms,fltk 等等)中脱颖而出的还是基于 Qt 的重量级软件 KDE。 信号和槽机制 Qt提供了信号和槽机制用于完成见面操作的响应,是完成任意两个Qt对象之通信机制。其中,信号会在某个特定情况或动作下被触动,槽是等同于接受并处理信号的函数。 为什么方法不是直接调用的。中间用到 Signal 和槽机制不是多此一举? 其实在我们生活也是一样,老板级别的好说话,老板给助理分派任务也好说话,但是助理给老板分任务,可想而知会有什么后果,在以前的统治阶层肯定不允许这样的事发生。所以在分层思想中,我们所调用的函数也是这样的,上层可以调用下层和同一层的函数,下层函数不可以调用上层函数,否则程序的层次性会被打破,导致结构错综复杂,难以维护和管理。 那么怎样才能做到向上管理呢,有任务分配给老板怎么办? 老板会设立一个机构,也就是一个函数,用无限循环来查询助理的状态,如果助理真的有事情,这个机构就把这消息拿到老板来处理。但是这种处理方式显得有些复杂,我们想要的简单明了的方式是,如果助理有事件发生,可以直接调用老板函数处理。 说了这么多其实就是想说,信号和槽的最大优势在于,它完善了程序分层的思想,可以在不改变程序的层次性的情况下,完成由下层到上层的调用。在下层发出一个 Signal,这时上层与其想关联的 Slot 函数就会响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值