中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [调查]看看都有哪些人会正则表达式
投票标题: [调查]看看都有哪些人会正则表达式  (单选) [参与投票的会员]
会正则表达式,学PERL 的时候学的   6 (4.65%)
会正则表达式,学python 时学的   2 (1.55%)
会正则表达式,学PHP时学的   2 (1.55%)
会正则表达式,学ASP时学的   2 (1.55%)
会正则表达式,学批处理时学的   9 (6.98%)
会正则表达式,学VBS时学的   4 (3.10%)
会正则表达式,学C时学的   9 (6.98%)
会正则表达式,学习其它语言学的   16 (12.40%)
会正则表达式,通过其它途经学会的   9 (6.98%)
天资聪慧智商超人无师自通   2 (1.55%)
不会正则表达式,但想学。。。   26 (20.16%)
不会。   42 (32.56%)


« [1] [2] [3] [4] [5] [6] [7] »
作者:
标题: [调查]看看都有哪些人会正则表达式 上一主题 | 下一主题
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,

   此帖被 +15 点积分         点击查看详情   
评分人:【 yishanju 分数: +15  时间:2009-5-28 06:47


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
状态 离线
『第 64 楼』:  

还在研究中。。。

   此帖被 +9 点积分       点击查看详情   
评分人:【 yishanju 分数: +9  时间:2009-5-29 03:35


2009-5-28 23:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 65 楼』:  



  Quote:
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
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 楼』:  

可怜啊..太复杂了..殊不知从何下手

   此帖被 +9 点积分       点击查看详情   
评分人:【 yishanju 分数: +9  时间:2009-5-30 08:35


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。

   此帖被 +15 点积分         点击查看详情   
评分人:【 yishanju 分数: +15  时间:2009-5-30 08:35


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语言有正则么?还没有学到……

   此帖被 +9 点积分       点击查看详情   
评分人:【 yishanju 分数: +9  时间:2009-5-31 10:49


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;
}
好久没用了,也不知道对了没有,
另外这算不算是这规表达式呢?

   此帖被 +9 点积分       点击查看详情   
评分人:【 yishanju 分数: +9  时间:2009-5-31 10:49


2009-5-31 10:39
查看资料  发送邮件  发短消息 网志  OICQ (527385656)  编辑帖子  回复  引用回复
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
状态 离线
『第 73 楼』:  

继续C中正则表达式的使用  http://blog.chinaunix.net/u2/67187/showart.php?id=653481




有问题请发论坛或者自行搜索,再短消息问我的统统是SB
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
状态 离线
『第 75 楼』:  

我也想,这是我的处女帖。

   此帖被 +9 点积分       点击查看详情   
评分人:【 yishanju 分数: +9  时间:2009-6-3 00:56


2009-6-2 23:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] [4] [5] [6] [7] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: