|
yishanju
银牌会员
[b]看你妹啊[/b]
积分 1488
发帖 1357
注册 2006-5-20
状态 离线
|
『第
61 楼』:
楼上的直接无敌了。
|
有问题请发论坛或者自行搜索,再短消息问我的统统是SB |
|
2009-5-28 02:49 |
|
|
twfcc
初级用户
积分 28
发帖 4
注册 2009-5-6
状态 离线
|
『第
62 楼』:
perl , ruby 的會有更多的表達式 , 如 \d 代表數字, \s 空格等
gawk , egrep, bash 的是 extended Regular expression
sed, grep 用的是 basic regular expression ,意味 [0-9]+ 不能用,要這樣
[0-9][0-9]* 表達一個或以上的數字
我寫了從個[url]www.proxy4free.com[/url]取得代理url 的gawk簡單腳本, gnuwin32 gawk
用不到,只可用*nix 或 cygwin 跑, gnuwin32 gawk socket 功能給xp 廢了
#!/usr/bin/gawk -f
BEGIN{
header="GET [url]http://www.proxy4free.com/page1.html[/url] HTTP/1.0\r\n\r\n \
Connection: Keep-Alive\n\r\n\r \
Accept: text/html\n\r\n\r \
Accept-Charest: iso-8859-1, *, utf-8\n\r\n\r \
Accept-Language: en, zh, ja\n\r\n\r \
Host: [url]www.proxy4free.com:80[/url]\n\r\n\r \
User-Agent: gawk_script/0.1a [en, zh] (Cygwin, NT)\n\r\n\r"
host="www.proxy4free.com"
remotehost="/inet/tcp/0/" host "/80"
print header |& remotehost
while ((remotehost |& getline) > 0){
if ($0 ~ /^<td>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+<\/td>$/){
gsub(/<[^>]+>/, "")
print $0
} else if ($0 ~ /^<td>[0-9]+<\/td>$/){
gsub(/<[^>]+>/, "")
print $0
} else if ($0 ~ /^<td>[A-Za-z]+<\/td>$/){
gsub(/<[^>]+>/, "")
print $0
} else if ($0 ~ /^<td>^[A-Z][a-zA-Z]+[ \t]?[A-Z]*[A-Za-z]*<\/td>$/){
gsub(/<[^>]+>/, "")
print $0
} else if ($0 ~ /^<td>20[0-1][0-9]-0?[1-9]+-0?[0-9]+<\/td>$/){
gsub(/<[^>]+>/, "")
print $0
printf("\n----------------\n")
} else {
continue
}
}
close(remotehost)
}
還有三個用gawk, bash, perl 寫的香港六合彩小腳本,也用上了一些RE
#! /bin/bash
# marksix genertor, Usage: $0 [ [option] argument ]
output=""
base_array=({1..49})
length=${#base_array[@]}
argument=$1
howmany=${argument:-6}
usage="Usage:\t${0##*/} [[option] number of picks](default 6)"
message_to_user="Number of picks should not be greater than $length"
out_of_range=66
non_numberic_argument=65
if [[ $howmany =~ [^0-9]+ ]]
then
echo -e "$usage" >&2 ; exit $non_numberic_argument
elif [ $howmany -gt $length ]
then
echo "$message_to_user" >&2 ; exit $out_of_range
fi
for (( i=1 ; i<=howmany ; i++ ))
do
pick=${base_array[$(( RANDOM % length ))]}
output="$output $pick"
resize_array=($(echo ${base_array[@]} | sed "s/\<$pick\>//"))
base_array=(${resize_array[@]})
length=${#base_array[@]}
done
sort_result=$( printf '%s\n' $output | sort -n )
echo -e ${sort_result//\n/" "}
gawk version
#! /usr/bin/gawk -f
BEGIN{
howmany=ARGV[1]
output=""
base="1,2,3,4,5,6,7,8,9,10,"
base=base "11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,"
base=base "31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49"
usage="Usage:\t marksix.awk [number](default 6)"
n=split(base, arr, ",")
if ( howmany ~ /[^0-9]+/ || howmany > n ){
print usage > "/dev/stderr"
exit 5
} else if ( howmany == "" ){
howmany=6
}
srand()
for (i=1; i<=howmany; i++){
randnum=int(rand() * n * howmany) % n + 1
pick=arr[randnum]
output=output " " pick
delete arr[randnum]
n=asort(arr)
}
{
sorted=""
split(output, a, " ")
z=asort(a, out)
for (i=1; i<=z; i++){
sorted=sorted " " out[i]
}
sub(/^ /, "", sorted)
print sorted
}
}
perl version
#! /usr/bin/perl
# marksix generator, perl version
@num=qw(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
42 43 44 45 46 47 48 49) ;
$length=@num ;
$output="" ;
$howmany=$ARGV[0] ;
$i=1 ;
die "Number of picks should not be greater than $length\n" if ($howmany > $length) ;
die "Usage:\t$0 [[option]number of picks](default 6)\n" if ($howmany =~ /\D+/) ;
$howmany = 6 if (@ARGV == 0) ;
while ($i <= $howmany){
srand ;
$random=int(rand() * $length * $i) % $length ;
$pick=$num[$random] ;
$output="$output $pick" ;
splice (@num, $random, 1) ;
$length=@num ;
$i++ ;
}
@out=split(" ", $output) ;
@sorted=sort {$a <=> $b} @out ;
print "@sorted\n"
還有一個給linux `free' cygwin 代替品, 也用上一些ruby 的re
$ cat bin/free
#! /usr/bin/ruby
# roustic free for cygwin, ruby version
class PrintHeader
def initialize(i="total", j="used", k="free")
@a = i
@b = j
@c = k
end
def header
print "\t", @a, "\t", @b, "\t", @c, "\n"
end
end
n = PrintHeader.new("總數", "已用", "剩餘")
n.header
filename = "/proc/meminfo"
file = open(filename)
while text = file.gets
if text =~ /Mem:|Swap:/
str = [ text.split(/\s+/) ]
step = 1024 * 1024
str.each { |i|
j = i[0]
a = i[1].to_i / step.to_i
b = i[2].to_i / step.to_i
c = i[3].to_i / step.to_i
print j, "\t", a," M", "\t", b," M", "\t", c," M", "\n"
}
end
end
file.close
我不是顯擺,只是證明我沒有胡吹,當然我寫程序還是不入流, 但那幾種RE
還是會一點點皮毛
在win32 用findstr 就可學 basic regular expression , 因為我不會批次檔,
findstr 不怎麼用,但它的BRE 大至上就是gnu grep 的BRE,
|
|
2009-5-28 06:13 |
|
|
twfcc
初级用户
积分 28
发帖 4
注册 2009-5-6
状态 离线
|
『第
63 楼』:
re 有什麼用?相當好用
http://www.bathome.cn/thread-4615-1-1.html
有一個這樣的問題,機本用 RE 就可以了
User@User-PC ~
$ cat sometxt
SDI_cad12_k010002_dft_a2.prt
SDI_k010003_dft_a3_sht.prt
SDI_cad12_k010004_dft_a2_sht.prt
$ sed 's/\(SDI_.*\)\(k[0-9][0-9]*_dft\)\(.*\)\(\..*\)$/\2\4/' sometxt
k010002_dft.prt
k010003_dft.prt
k010004_dft.prt
那些腳本語言只要懂得 RE 就可對文本自動編輯,
|
|
2009-5-28 07:04 |
|
|
yyyyyyyyy
初级用户
积分 137
发帖 85
注册 2007-11-26
状态 离线
|
|
2009-5-28 23:24 |
|
|
yishanju
银牌会员
[b]看你妹啊[/b]
积分 1488
发帖 1357
注册 2006-5-20
状态 离线
|
|
2009-5-29 03:38 |
|
|
twfcc
初级用户
积分 28
发帖 4
注册 2009-5-6
状态 离线
|
『第
66 楼』:
上面那個問題,如果以 bash3.X 的正規表示式來做,
就是延伸正規表示式(extended regular expression)
大約是這樣
nc10@your-5554c55be4 ~
$ cat sometxt
SDI_cad12_k010002_dft_a2.prt
SDI_k010003_dft_a3_sht.prt
SDI_cad12_k010004_dft_a2_sht.prt
nc10@your-5554c55be4 ~
$ cat bash_re
#! /bin/bash
while IFS= read -r
do
[[ "$REPLY" =~ ([A-Z]{3}_.*)([a-z][0-9]+_[a-z]{3})(_.*)(\..*) ]]
out="${BASH_REMATCH[2]}${BASH_REMATCH[4]}"
echo "$out"
done < "$*"
nc10@your-5554c55be4 ~
$ sh bash_re sometxt
k010002_dft.prt
k010003_dft.prt
k010004_dft.prt
nc10@your-5554c55be4 ~
$
跟 sed 一樣可以用 group(組?); sed 以 \1 \2 ...\9 作為 backreference,
表示符合條件 的group(組?); bash 以默認數組($BASH_REMATCH)作配對符合條件的部份, perl 以 $1 $2..... 等, gnu 軟件的 RE 還有 \`, \' , \w, \W , \b ... 等
正規表示式差不多是一門語言,但學會就非常好用,大多數的腳本語言
都會支援它,^_^, 如果未學的版友,花點時間學上它,我保證你不會後悔
呵呵,我也只會點皮毛
|
|
2009-5-29 11:13 |
|
|
406317577
初级用户
积分 98
发帖 45
注册 2008-8-30
状态 离线
|
『第
67 楼』:
可怜啊..太复杂了..殊不知从何下手
|
|
2009-5-29 18:57 |
|
|
ceii
初级用户
积分 115
发帖 45
注册 2007-3-3
状态 离线
|
『第
68 楼』:
我的正则表达式学习过程:
2003年底架设apach服务时,因为想过滤网址,于是查看手册,第一次接触正则表达式这个词,并马上学会了“^”字符的用法,手册里介绍正则表达式只有十几行,看了一下,又学会了“*”和“+”的用法,当时我并不知道我接触的是大名鼎鼎的正则表达式,只把它当成类似于DOS命令中的通配符已。
直到两年后,使用UltraEdit编辑文件时,偶然发现它的“查找替换”有正则表达式选项,尝试使用一下,发现查找到的字串非常符合我的想法,我对正则表达式开始有点兴趣了,上网搜索支持正则表达式的编辑器,最后锁定vim,知道正则表达式的功能比预想的强大得多,又上网搜索支持正则表达式的任何软件,这样我认识了grep、sed和awk,在这几个命令行小工具里,我终于见识了正则表达式的超强功能,有相见恨晚的感觉。当知道这些都是来源于Linux以后,我对Linux非常偏爱,专门安装了Linux,学了很多Linux命令。
随着了解的深入,发现越来越多的工具支持正则表达式,最令我意外的是,自己一直使用了两三年的php和MySQL,还有JavaScript竟然也支持正则表达式。
现在,我使用正则表达式最多的工具是sed和vim。
|
|
2009-5-30 06:55 |
|
|
yishanju
银牌会员
[b]看你妹啊[/b]
积分 1488
发帖 1357
注册 2006-5-20
状态 离线
|
『第
69 楼』:
Quote: | Originally posted by 406317577 at 2009-5-29 18:57:
可怜啊..太复杂了..殊不知从何下手 |
|
其实很简单的,正则表达式就是一种描述字符串规律表达方式。
各种程序语言里大都支持正则表达式(各种语言的正则表达式写法可能稍有差异),很多文字编辑工具也都支持。
学会一门编程语言的基本语法,网上找个教程,就可以开学习正则表达式了
或者找一个支持正则表达式的命令行工具,比如像FR SED AWK GAWK等等。
只用WINDOWS的用户我推荐FR,FR 是一个正则查找替换工具,非常简单好用,我自己一直在用的
FR 下载:http://baiy.cn/utils/fr/index.htm
|
有问题请发论坛或者自行搜索,再短消息问我的统统是SB |
|
2009-5-30 08:34 |
|
|
Evangel
初级用户
积分 145
发帖 95
注册 2008-4-12
状态 离线
|
『第
70 楼』:
很想知道,c语言有正则么?还没有学到……
|
|
2009-5-31 05:59 |
|
|
dnntgmfd
初级用户
积分 85
发帖 52
注册 2009-1-10 来自 湘乡
状态 离线
|
『第
71 楼』:
#include <iostream.h>
void main()
{
int a=0,b=0;
for(a=0,a++,a<100)
b=b+1;
cout<<b<<endl;
}
好久没用了,也不知道对了没有,
另外这算不算是这规表达式呢?
|
|
2009-5-31 10:39 |
|
|
yishanju
银牌会员
[b]看你妹啊[/b]
积分 1488
发帖 1357
注册 2006-5-20
状态 离线
|
『第
72 楼』:
Quote: | Originally posted by Evangel at 2009-5-31 05:59:
很想知道,c语言有正则么?还没有学到…… |
|
不懂C,不过应该可以下载到相应的函数库
正则表达式主要用来处理字符串,所以看看C处理字符串看看,
|
有问题请发论坛或者自行搜索,再短消息问我的统统是SB |
|
2009-5-31 10:40 |
|
|
yishanju
银牌会员
[b]看你妹啊[/b]
积分 1488
发帖 1357
注册 2006-5-20
状态 离线
|
|
2009-5-31 10:46 |
|
|
yishanju
银牌会员
[b]看你妹啊[/b]
积分 1488
发帖 1357
注册 2006-5-20
状态 离线
|
『第
74 楼』:
Quote: | Originally posted by dnntgmfd at 2009-5-31 10:39:
#include <iostream.h>
void main()
{
int a=0,b=0;
for(a=0,a++,a<100)
b=b+1;
cout<<b<<endl;
}
好久没用了,也不知道对了没有,
另外这算不算是这规表达式呢? |
|
明显不是
百度一下正则表达式的概念。。。
正则表达式是一种神奇伟大美好。。。的东西
|
有问题请发论坛或者自行搜索,再短消息问我的统统是SB |
|
2009-5-31 10:48 |
|
|
tslnyys
初级用户
积分 29
发帖 17
注册 2009-6-2
状态 离线
|
|
2009-6-2 23:53 |
|
|