正则表达式

论坛里讨论正则表达式的帖子,这东西没用就忘了,目前没有这方面的学习计划,但备份一下

 

 [正则表达式学习网址和电子书]
--过客博客
----正则基础
----http://blog.csdn.net/lxcnn/category/538256.aspx
----.NET正则
----http://blog.csdn.net/lxcnn/category/538257.aspx
--deelx
----http://www.regexlab.com/zh/deelx/

[正则表达式学习书籍]
--《C#字符串和正则表达式参考手册》
----译者: 刘乐亭
----清华大学出版社

--《精通正则表达式:第3版》
----译者: 余晟
----电子工业出版社

--正则30分钟入门教程(q107770540提供)
http://download.csdn.net/source/2844387

[正则表达式常见问题解答]

[正则表达式典型问题分析、点评]

-----------------Section1[反向引用]-----------------
参与:q107770540(11楼)/wuyi8808
Q:(?i)<img[^>]*?src=(['""]?)(?<img>[^'""\s>]+)\1[^>]*>
  此表达式中 \1 代表什么?
A:\1 表示捕获组1。也就是前面的 (['""]?) 捕获到的内容,可能是 ' 或 " 或 空(什么也没有)。

-----------------Section2[条件表达式:(?(group_name)yes|no)]-----------------
Q:匹配数字、字母的组合,数字和字母至少各出现一次。
A:^(\d(?<DIGIT>)|[a-zA-Z](?<ALPHA>))+(?(DIGIT)|(?!))(?(ALPHA)|(?!))$
分析:
首先需要匹配数字、字母,则首先想到[a-zA-Z0-9],但无法判断某个范围必然出现,解决方法有2种,这里的是利用.net的命名捕获组和条件表达式。
\d(?<DIGIT>)将数字捕获,压入堆栈分组记录分组名为DIGIT
[a-zA-Z](?<ALPHA>)将大小写字母捕获,又阿如堆栈分组记录分组名为:ALPHA
(\d(?<DIGIT>)|[a-zA-Z](?<ALPHA>))+以上两种情况至少出现一次,尽量多匹配
(?(DIGIT)|(?!))在前面的匹配结束后,判断分组DIGIT是否捕获成功,捕获到不执行任何操作,反之执行(?!)
(?(ALPHA)|(?!))在前面的匹配结束后,判断分组ALPHA是否捕获成功,捕获到不执行任何操作,反之执行(?!)
yes部分没写任何内容,则直接返回匹配成功,(?!)表示匹配一个位置,(?!exp),省略了exp表达式,则此表达式(?!)永远为假,表示整个表达式失配。
此方法是08年c#版一个问题,当年思归的回复,仅贴出共大家参考,扩展条件表达式的使用思路。不是解决此问题的唯一解法。
过客曾给出过非.net的js通用写法,原文不记得了,大概是这个意思:
^(?!\D+$)(?![^a-zA-Z]+$)[a-zA-Z0-9]+$

^(?!\d+$)(?![a-zA-Z]+$)[a-zA-Z0-9]+$
利用环视,先判断是否包含数字、是否包含字母,在都存在的情况下匹配字母和数字,此方法可以扩展为很多问题的应用。 ^_^

-----------------Section3[\G:匹配从上一次的结束位置开始]-----------------
参与讨论:bao110908[26楼]/wuyi8808[42楼]
Q: "0123456789"按每4个分开
A(1): String[] strs = "0123456789".split("(?<=\\G.{4})");
A(2):这个 "(?<=\\G.{4})" 要改为 "(?<=\\G.{4})(?!$)",否则会对 "12345678" 这类长度是 4 的倍数的字符串拆分时最后多一个空串出来。
亮点:\G的使用


[其他正则问题精彩贴搜集]
大家心目中正则的最厉害的一招展示
环视是否适合所有场合?
分组split的问题
.*?可以匹配到什么?
一个正则小问题
c#字符串处理cj205的回答,是一个很精彩的逆序环视例子
[变态正则]征集答案
正则:如果在固定范围内找符合条件的内容?
一个有趣的规则

[正则表达式测试工具]
Match Tracer
Deelx网站提供的工具,同时提供了一个.h文件实现了完整的正则表达式引擎,方便c++使用。

RegexBuddy
支持多种正则引擎选择,测试利器。

在线正则表达式测试(xming4321(十一文)推荐)
http://regexpal.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值