Bash的=~正则表达式匹配~旧文章害死人啊

很简单的一个匹配ip地址的测试,死活就是匹配不了:

newip='192.168.1.100'
if [[ "$newip" =~ '^([0-9]{1,3}\.){3}[0-9]{1,3}$' ]];then
    echo '找到了ip地址'
fi

翻遍了google中的中文资料,都没发现问题。最后终于用英文搜到《Advanced Bash-Scripting Guide》中的一篇介绍Bash版本的文章,其中写道: 继续阅读Bash的=~正则表达式匹配~旧文章害死人啊

Vim多行匹配以及排除字符串

Vim多行匹配以及排除字符串

原文地址:http://zengrong.net/post/1429.htm

一个很简单的需求,在下面的XML文件中匹配 <frame> 块。

一开始写了一个:

^\s\+<frame>\_[^\(frame\)]*<\/frame>

这样能达到需求,但是却是凑巧。

因为 [^\(frame\)] 其实并不会匹配一个frame字符串,它依然是将组中的字符串单独对待的。如果在<frame>块之间包含frame中的任何一个字符串,那么匹配就会失败。

凑巧的是,正好在下面的范例中,并没有出现这样的情况。

既然有问题,那么就修改下,最终的版本是这样的:

^\s\+<frame>\(frame\)\@!\_.*<\/frame>

\@! 相当于 perl正则表达式中的 ?!,它的含义是“不匹配一个组”。\@! 后面需要跟 . 来确定匹配范围。为了匹配换行,这里使用了\_.

Vim的正则格式真是不走寻常路啊……无处不在的转义和非转义让人崩溃…… 继续阅读Vim多行匹配以及排除字符串

AS3中正则表达式对反斜杠的替换

原文地址:http://zengrong.net/post/1374.htm

AS3中正则表达式对反斜杠的替换

一个有趣的小问题,下面的正则表达式能替换成功么?

var __str:String = '1234\6789';
trace(__str.replace(/\\/g, '5'));

答案是:不能。trace出来的结果为:

[trace] 12346789

其实正则本身并没有写错,错在被替换的字符串。反斜杠 “\” 在AS3中是转义符,会将其后的任何值转换为本身,因此看到的字符串其实本身就是 12346789 ,也就是没有反斜杠,当然无法搜索到。

直接 trace(__str) ,结果和上面的trace相同。

希望得到正确的结果,需要将字符串设置为: 1234\\6789 ,我们看到的是 两个 反斜杠,而AS3认为它是 一个 反斜杠。

如果使用RegExp来建立正则,则需要使用4个反斜杠:

var __str:String = '1234\\6789';
var __reg:RegExp = new RegExp('\\\\', '');
trace(__str.replace(__reg, '5'));

这种情况只在硬编码字符串的时候出现,而如果字符串出现在 TextField中,从 TextField.text 中取出的字符串,本身就自动进行了转义,看到的 一个 反斜杠,其实是 两个 反斜杠。

使用正则表达式解决配置文件字符串替换的思路和例子

正则表达式是非常强大的字符串处理工具,但由于晦涩难懂,唯有不断的学习和使用,才能积累经验。我使用正则表达式总是断断续续,所以水平也很初级。下面就记录这次的使用经验,备查。

下面的xml代码是一个游戏技能配置文件的简化版,其中的items是一个技能,item是该技能的一个级别的值。desc属性是该技能的介绍文本。由于介绍中包含对技能的效果的引用,而技能的效果在不同的技能级别中的值是不同的,因此这里使用定界符来标识可能会变动的值。

针对定界符,我制定的规则很简单,用花括号 {} 包含要替换的属性值即可,如 {key} ,其中key就是属性名称。对于使用数组方式提供的属性值,则使用 {key[n]} 的方式来提供,其中n是数组的索引。

程序中要做的,就是在游戏中需要技能的介绍的时候,会根据技能的级别获取到相关的的值,然后查询desc中有哪些定界符,再根据定界符获取到item中的值,最后进行替换。

这个工作虽然并不复杂,但也不是indexof能够解决的,后面就是我使用正则表达式的处理思路。对于XML的解析,我使用E4X。 继续阅读使用正则表达式解决配置文件字符串替换的思路和例子

ActionScript3正则表达式学习笔记(1)-创建正则表达式

此笔记是我阅读Flex 2.01 Help后的笔记,并不是帮助的翻译。


创建正则表达式有两种方式:

var re1:RegExp = new RegExp("zrong", "i");
var re2:RegExp = /zrong/i;

在第一种方式中,第二个参数是正则表达式的参数,如果正则表达式不需要参数,则可以将第二个参数使用空字符串代替。

首选的是第二种方式,书写的代码较少,而且对引号不需要转义。但是第二种方式需要使用 \/ 进行转义。例如:

var re1:RegExp = new RegExp("1/2 \"ZRong's Blog\"", "");
var re2:RegExp = /1\/2 "ZRong's Blog"/;

在第一种方式中,针对已经包含 \ 的操作符(例如 /d/w ),也需要用 \ 转义,例如:

var re1:RegExp = new RegExp("\\d+", "");
var re2:RegExp = /\d+/;

几个常用的正则表达式(大部分原创)

验证用户名格式:

^[a-zA-Z0-9]([\.]?[\-]?[_]?[a-zA-Z0-9]){2,19}$

英文数字打头,中间可包含不连续的 . 和 – 和 _ ,长度为 3 -20 位

验证英文内容:

^[a-zA-Z]{1,}$

长度至少1位

验证Email:经过我改良的表达式,很好用

^[a-zA-Z0-9]([\.]?[\-]?[_]?[a-zA-Z0-9])*@\w+([\.-]?\w+)*(\.\w{2,4})+$

英文数字打头,中间可包含不连续的 . 和 – 和 _ ,不限域名格式

验证QQ:

^[1-9]\d{4,10}$

正数开头,5 – 10 位

验证日期:格式为 xxxx-xx-xx ,超强,剔除了无效日期(如非闰年的2-29 号)

^(?:([0-9]{4}-(?:(?:0?[1,3-9]|1[0-2])-(?:29|30)|((?:0?[13578]|1[02])-31)))|([0-9]{4}-(?:0?[1-9]|1[0-2])-(?:0?[1-9]|1\d|2[0-8]))|(((?:(\d\d(?:0[48]|[2468][048]|[13579][26]))|(?:0[48]00|[2468][048]00|[13579][26]00))-0?2-29)))$

验证域名:

^[a-zA-z0-9]+(\.)[a-zA-z0-9]+(\.)[a-zA-z0-9]+$|^[a-zA-z0-9]+(\.)[a-zA-z0-9]+(\.)[a-zA-z0-9]+(\.)[a-zA-z0-9]+$|^(localhost)$

可验证 x.x.x.x 和 x.x.x 以及 localhost 格式

验证协议地址:ftp://1.2.3.4

^(ftp://)(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$

协议可自行修改

验证IPV4地址:剔除无效格式,如 333.3.4.5

^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$