![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-12 12:02 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [调查]看看都有哪些人会正则表达式 |
| 可打印版本 17,339 / 104 |
| 第61楼 yishanju | 发表于 2009-05-28 02:49 |
| 银牌会员 发帖 1,357 积分 1,488 | |
|
楼上的直接无敌了。
|
|
| 第62楼 twfcc | 发表于 2009-05-28 06:13 |
| 初级用户 发帖 4 积分 28 | |
|
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, |
|
| 第63楼 twfcc | 发表于 2009-05-28 07:04 |
| 初级用户 发帖 4 积分 28 | |
|
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 就可對文本自動編輯, |
|
| 第64楼 yyyyyyyyy | 发表于 2009-05-28 23:24 |
| 初级用户 发帖 85 积分 137 | |
|
还在研究中。。。
|
|
| 第65楼 yishanju | 发表于 2009-05-29 03:38 |
| 银牌会员 发帖 1,357 积分 1,488 | |
Originally posted by twfcc at 2009-5-28 07:04: 用正则处理文本感觉真的很爽,如鱼得水。 WINDOWS 下有支持正则查找替换的FR http://baiy.cn/utils/fr/index.htm 非常的好用。 |
|
| 第66楼 twfcc | 发表于 2009-05-29 11:13 |
| 初级用户 发帖 4 积分 28 | |
|
上面那個問題,如果以 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 ... 等 正規表示式差不多是一門語言,但學會就非常好用,大多數的腳本語言 都會支援它,^_^, 如果未學的版友,花點時間學上它,我保證你不會後悔 呵呵,我也只會點皮毛 |
|
| 第67楼 406317577 | 发表于 2009-05-29 18:57 |
| 初级用户 发帖 45 积分 98 | |
|
可怜啊..太复杂了..殊不知从何下手
|
|
| 第68楼 ceii | 发表于 2009-05-30 06:55 |
| 初级用户 发帖 45 积分 115 | |
|
我的正则表达式学习过程:
2003年底架设apach服务时,因为想过滤网址,于是查看手册,第一次接触正则表达式这个词,并马上学会了“^”字符的用法,手册里介绍正则表达式只有十几行,看了一下,又学会了“*”和“+”的用法,当时我并不知道我接触的是大名鼎鼎的正则表达式,只把它当成类似于DOS命令中的通配符已。 直到两年后,使用UltraEdit编辑文件时,偶然发现它的“查找替换”有正则表达式选项,尝试使用一下,发现查找到的字串非常符合我的想法,我对正则表达式开始有点兴趣了,上网搜索支持正则表达式的编辑器,最后锁定vim,知道正则表达式的功能比预想的强大得多,又上网搜索支持正则表达式的任何软件,这样我认识了grep、sed和awk,在这几个命令行小工具里,我终于见识了正则表达式的超强功能,有相见恨晚的感觉。当知道这些都是来源于Linux以后,我对Linux非常偏爱,专门安装了Linux,学了很多Linux命令。 随着了解的深入,发现越来越多的工具支持正则表达式,最令我意外的是,自己一直使用了两三年的php和MySQL,还有JavaScript竟然也支持正则表达式。 现在,我使用正则表达式最多的工具是sed和vim。 |
|
| 第69楼 yishanju | 发表于 2009-05-30 08:34 |
| 银牌会员 发帖 1,357 积分 1,488 | |
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 |
|
| 第70楼 Evangel | 发表于 2009-05-31 05:59 |
| 初级用户 发帖 95 积分 145 | |
|
很想知道,c语言有正则么?还没有学到……
|
|
| 第71楼 dnntgmfd | 发表于 2009-05-31 10:39 |
| 初级用户 发帖 52 积分 85 来自 湘乡 | |
|
#include <iostream.h>
void main() { int a=0,b=0; for(a=0,a++,a<100) b=b+1; cout<<b<<endl; } 好久没用了,也不知道对了没有, 另外这算不算是这规表达式呢? |
|
| 第72楼 yishanju | 发表于 2009-05-31 10:40 |
| 银牌会员 发帖 1,357 积分 1,488 | |
Originally posted by Evangel at 2009-5-31 05:59: 不懂C,不过应该可以下载到相应的函数库 正则表达式主要用来处理字符串,所以看看C处理字符串看看, |
|
| 第73楼 yishanju | 发表于 2009-05-31 10:46 |
| 银牌会员 发帖 1,357 积分 1,488 | |
| 第74楼 yishanju | 发表于 2009-05-31 10:48 |
| 银牌会员 发帖 1,357 积分 1,488 | |
Originally posted by dnntgmfd at 2009-5-31 10:39: 明显不是 百度一下正则表达式的概念。。。 正则表达式是一种神奇伟大美好。。。的东西 |
|
| 第75楼 tslnyys | 发表于 2009-06-02 23:53 |
| 初级用户 发帖 17 积分 29 | |
|
我也想,这是我的处女帖。
|
|
| 上一页 1 … 2 3 4 5 6 7 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |