分页: 1 / 1

求助: 正则表达式中的‘+’

发表于 : 2012-02-22 21:36
Think1st

代码: 全选

  1 #!/bin/sh
  2 
  4 case $1 in
  5      [0-9]+)
  6                    echo "Agreed"
  7                                    ;;
  11         *) ;;
  12 esac 
为什么匹配 "009" 不成功, 匹配 "0+“ 成功了。
case语句支持的正则表达式是什么标准啊? :em20

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-22 21:47
ChenFengyuan
这个不是正则,是通配
[0-9]+改成[0-9]*

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-22 22:53
eexpress
bash某版本开始支持正则啊。
就是多于一个数字。
没测试过。

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-23 9:42
Think1st

代码: 全选

  1 #!/bin/sh
  2 
  4 case $1 in
  5      [0-9]*)
  6                    echo "Agreed"
  7                                    ;;
  11            *) ;;
  12 esac 
改成[0-9]*可以匹配,但是输入 00000 或者输入 0000a
居然结果都是 "Agreed",照例说 [0-9]*不匹配0000a 的吧?
彻底不明白了。。。 :em20

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-23 11:13
naturalaw
前面提醒过是通配符嘛。:em20
[0-9]* 数字开头即可
通配符你懂的,正则的*表示0次或者0次以上

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-23 16:38
Think1st
懂可以懂,只是混乱了。。
shell script里的case语句支持的不是正则表达式匹配,而是通配符匹配?
我只知道grep,awk,sed是支持正则表达式匹配不是通配符。。
这么说的话,case语句的匹配是什么标准。

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-23 16:46
Think1st
naturalaw 写了:前面提醒过是通配符嘛。:em20
[0-9]* 数字开头即可
通配符你懂的,正则的*表示0次或者0次以上
好像是我高估了case语句的能力,
双分号“;;”表示命令序列结束。
• 匹配模式中可是使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或,也可以使用通配符*。
匹配以n开头的所有情况: n*
匹配yes的所有字母大小不同的情况: [yY][eE][sS]
但不支持{}匹配,因为模板可以使用 | 就可以达到目的。
• 最后的“*)”表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行“*)”后
的命令序列。
没有学好基本功。。 :em06

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-26 11:39
aerofox

代码: 全选

  1 #!/bin/sh
  2 set -o extglob
  4 case $1 in
  5      +([0-9]) )
  6                    echo "Agreed"
  7                                    ;;
  11         *) ;;
  12 esac 

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-26 11:57
tusooa

代码: 全选

if [[ $1 =~ [0-9]+ ]] ; then
    echo Agreed
fi

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-27 9:19
Think1st
aerofox 写了:

代码: 全选

  1 #!/bin/sh
  2 set -o extglob
  4 case $1 in
  5      +([0-9]) )
  6                    echo "Agreed"
  7                                    ;;
  11         *) ;;
  12 esac 
提示 Illegal option -o extglob :em20

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-27 9:20
Think1st
tusooa 写了:

代码: 全选

if [[ $1 =~ [0-9]+ ]] ; then
    echo Agreed
fi
恩,多个匹配的时候是不是用if..elif..else的句型。

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-27 9:25
jarlyyn
正则的话,要完全匹配最还还是加上^$两个符号代表开头和结尾

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-02-29 18:50
aerofox
Think1st 写了:
aerofox 写了:

代码: 全选

  1 #!/bin/sh
  2 set -o extglob
  4 case $1 in
  5      +([0-9]) )
  6                    echo "Agreed"
  7                                    ;;
  11         *) ;;
  12 esac 
提示 Illegal option -o extglob :em20
写错了,应该是

代码: 全选

shopt -s extglob

Re: 求助: 正则表达式中的‘+’

发表于 : 2012-03-01 9:58
Think1st
aerofox 写了:
Think1st 写了:
aerofox 写了:

代码: 全选

  1 #!/bin/sh
  2 set -o extglob
  4 case $1 in
  5      +([0-9]) )
  6                    echo "Agreed"
  7                                    ;;
  11         *) ;;
  12 esac 
提示 Illegal option -o extglob :em20
写错了,应该是

代码: 全选

shopt -s extglob
恩,有用!

顺便查了一下子使用方法,
Bash Shell有个extglob选项,开启之后Shell可以另外识别出5个模式匹配操作符,能使文件匹配更加方便。
开启方法很简单,使用shopt命令:shopt -s extglob
关闭,使用shopt命令:shopt -u extglob

开启之后,以下5个模式匹配操作符将被识别:

?(pattern-list) - 所给模式匹配0次或1次; *(pattern-list) - 所给模式匹配0次以上包括0次;+(pattern-list) - 所给模式匹配1次以上包括1次; @(pattern-list) - 所给模式仅仅匹配1次;!(pattern-list) - 不匹配括号内的所给模式。