中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-30 16:18
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [调查]看看都有哪些人会正则表达式 查看 16,499 回复 104
投票标题: [调查]看看都有哪些人会正则表达式 (单选)
会正则表达式,学PERL 的时候学的 6 票 · 4.7%
会正则表达式,学python 时学的 2 票 · 1.6%
会正则表达式,学PHP时学的 2 票 · 1.6%
会正则表达式,学ASP时学的 2 票 · 1.6%
会正则表达式,学批处理时学的 9 票 · 7%
会正则表达式,学VBS时学的 4 票 · 3.1%
会正则表达式,学C时学的 9 票 · 7%
会正则表达式,学习其它语言学的 16 票 · 12.4%
会正则表达式,通过其它途经学会的 9 票 · 7%
天资聪慧智商超人无师自通 2 票 · 1.6%
不会正则表达式,但想学。。。 26 票 · 20.2%
不会。 42 票 · 32.6%
61 发表于 2009-05-28 02:49 ·  中国 北京 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
楼上的直接无敌了。

有问题请发论坛或者自行搜索,再短消息问我的统统是SB
62 发表于 2009-05-28 06:13 ·  中国 广东 深圳 电信
初级用户
积分 28
发帖 4
注册 2009-05-06 00:46
17年会员
UID 144447
性别 男
状态 离线
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,
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
yishanju +15 2009-05-28 06:47
63 发表于 2009-05-28 07:04 ·  中国 广东 深圳 电信
初级用户
积分 28
发帖 4
注册 2009-05-06 00:46
17年会员
UID 144447
性别 男
状态 离线
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 发表于 2009-05-28 23:24 ·  中国 江苏 无锡 电信
初级用户
★★
积分 137
发帖 85
注册 2007-11-26 21:05
18年会员
UID 103862
性别 男
状态 离线
还在研究中。。。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
yishanju +9 2009-05-29 03:35
65 发表于 2009-05-29 03:38 ·  中国 北京 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
Originally posted by twfcc at 2009-5-28 07:04:
re 有什麼用?相當好用
http://www.bathome.cn/thread-4615-1-1.html
有一個這樣的問題,機本用 RE 就可以了

User@User-PC ~
$ cat sometxt
SDI_cad12_k010002_dft_a2.prt
SDI_k ...


用正则处理文本感觉真的很爽,如鱼得水。
WINDOWS 下有支持正则查找替换的FR http://baiy.cn/utils/fr/index.htm
非常的好用。

有问题请发论坛或者自行搜索,再短消息问我的统统是SB
66 发表于 2009-05-29 11:13 ·  中国 广东 深圳 电信
初级用户
积分 28
发帖 4
注册 2009-05-06 00:46
17年会员
UID 144447
性别 男
状态 离线
上面那個問題,如果以 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 发表于 2009-05-29 18:57 ·  中国 广东 东莞 电信
初级用户
积分 98
发帖 45
注册 2008-08-30 01:29
17年会员
UID 124535
性别 男
状态 离线
可怜啊..太复杂了..殊不知从何下手
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
yishanju +9 2009-05-30 08:35
68 发表于 2009-05-30 06:55 ·  中国 广西 南宁 电信
初级用户
积分 115
发帖 45
注册 2007-03-03 10:09
19年会员
UID 80655
性别 男
状态 离线
我的正则表达式学习过程:
  2003年底架设apach服务时,因为想过滤网址,于是查看手册,第一次接触正则表达式这个词,并马上学会了“^”字符的用法,手册里介绍正则表达式只有十几行,看了一下,又学会了“*”和“+”的用法,当时我并不知道我接触的是大名鼎鼎的正则表达式,只把它当成类似于DOS命令中的通配符已。
  直到两年后,使用UltraEdit编辑文件时,偶然发现它的“查找替换”有正则表达式选项,尝试使用一下,发现查找到的字串非常符合我的想法,我对正则表达式开始有点兴趣了,上网搜索支持正则表达式的编辑器,最后锁定vim,知道正则表达式的功能比预想的强大得多,又上网搜索支持正则表达式的任何软件,这样我认识了grep、sed和awk,在这几个命令行小工具里,我终于见识了正则表达式的超强功能,有相见恨晚的感觉。当知道这些都是来源于Linux以后,我对Linux非常偏爱,专门安装了Linux,学了很多Linux命令。
  随着了解的深入,发现越来越多的工具支持正则表达式,最令我意外的是,自己一直使用了两三年的php和MySQL,还有JavaScript竟然也支持正则表达式。
  现在,我使用正则表达式最多的工具是sed和vim。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
yishanju +15 2009-05-30 08:35
69 发表于 2009-05-30 08:34 ·  中国 北京 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
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
70 发表于 2009-05-31 05:59 ·  中国 四川 成都 电信
初级用户
★★
积分 145
发帖 95
注册 2008-04-12 16:29
18年会员
UID 115703
性别 男
状态 离线
很想知道,c语言有正则么?还没有学到……
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
yishanju +9 2009-05-31 10:49
71 发表于 2009-05-31 10:39 ·  中国 湖南 湘潭 电信
初级用户
★★
积分 85
发帖 52
注册 2009-01-10 18:22
17年会员
UID 136322
性别 男
来自 湘乡
状态 离线
#include <iostream.h>
void main()
{
int a=0,b=0;
for(a=0,a++,a<100)
b=b+1;
cout<<b<<endl;
}
好久没用了,也不知道对了没有,
另外这算不算是这规表达式呢?
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
yishanju +9 2009-05-31 10:49
72 发表于 2009-05-31 10:40 ·  中国 北京 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
Originally posted by Evangel at 2009-5-31 05:59:
很想知道,c语言有正则么?还没有学到……


不懂C,不过应该可以下载到相应的函数库

正则表达式主要用来处理字符串,所以看看C处理字符串看看,

有问题请发论坛或者自行搜索,再短消息问我的统统是SB
73 发表于 2009-05-31 10:46 ·  中国 北京 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线

有问题请发论坛或者自行搜索,再短消息问我的统统是SB
74 发表于 2009-05-31 10:48 ·  中国 北京 联通
银牌会员
★★★★
[b]看你妹啊[/b]
积分 1,488
发帖 1,357
注册 2006-05-20 12:00
20年会员
UID 55770
状态 离线
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
75 发表于 2009-06-02 23:53 ·  中国 河北 唐山 联通
初级用户
积分 29
发帖 17
注册 2009-06-02 06:03
17年会员
UID 146516
性别 男
状态 离线
我也想,这是我的处女帖。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
yishanju +9 2009-06-03 00:56
论坛跳转: