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

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
Think1st
帖子: 45
注册时间: 2012-02-07 23:08

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

#1

帖子 Think1st » 2012-02-22 21:36

代码: 全选

  1 #!/bin/sh
  2 
  4 case $1 in
  5      [0-9]+)
  6                    echo "Agreed"
  7                                    ;;
  11         *) ;;
  12 esac 
为什么匹配 "009" 不成功, 匹配 "0+“ 成功了。
case语句支持的正则表达式是什么标准啊? :em20
在这里,问题比答案更抢手。
头像
ChenFengyuan
帖子: 770
注册时间: 2008-03-23 0:39

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

#2

帖子 ChenFengyuan » 2012-02-22 21:47

这个不是正则,是通配
[0-9]+改成[0-9]*
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

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

#3

帖子 eexpress » 2012-02-22 22:53

bash某版本开始支持正则啊。
就是多于一个数字。
没测试过。
● 鸣学
头像
Think1st
帖子: 45
注册时间: 2012-02-07 23:08

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

#4

帖子 Think1st » 2012-02-23 9:42

代码: 全选

  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
在这里,问题比答案更抢手。
头像
naturalaw
帖子: 1360
注册时间: 2011-09-06 22:04

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

#5

帖子 naturalaw » 2012-02-23 11:13

前面提醒过是通配符嘛。:em20
[0-9]* 数字开头即可
通配符你懂的,正则的*表示0次或者0次以上
  • The eternal law
头像
Think1st
帖子: 45
注册时间: 2012-02-07 23:08

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

#6

帖子 Think1st » 2012-02-23 16:38

懂可以懂,只是混乱了。。
shell script里的case语句支持的不是正则表达式匹配,而是通配符匹配?
我只知道grep,awk,sed是支持正则表达式匹配不是通配符。。
这么说的话,case语句的匹配是什么标准。
在这里,问题比答案更抢手。
头像
Think1st
帖子: 45
注册时间: 2012-02-07 23:08

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

#7

帖子 Think1st » 2012-02-23 16:46

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

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

#8

帖子 aerofox » 2012-02-26 11:39

代码: 全选

  1 #!/bin/sh
  2 set -o extglob
  4 case $1 in
  5      +([0-9]) )
  6                    echo "Agreed"
  7                                    ;;
  11         *) ;;
  12 esac 
tusooa
帖子: 6548
注册时间: 2008-10-31 22:12
系统: 践兔
联系:

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

#9

帖子 tusooa » 2012-02-26 11:57

代码: 全选

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

代码: 全选

] ls -ld //
头像
Think1st
帖子: 45
注册时间: 2012-02-07 23:08

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

#10

帖子 Think1st » 2012-02-27 9:19

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
在这里,问题比答案更抢手。
头像
Think1st
帖子: 45
注册时间: 2012-02-07 23:08

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

#11

帖子 Think1st » 2012-02-27 9:20

tusooa 写了:

代码: 全选

if [[ $1 =~ [0-9]+ ]] ; then
    echo Agreed
fi
恩,多个匹配的时候是不是用if..elif..else的句型。
在这里,问题比答案更抢手。
头像
jarlyyn
帖子: 4671
注册时间: 2006-04-12 18:54
联系:

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

#12

帖子 jarlyyn » 2012-02-27 9:25

正则的话,要完全匹配最还还是加上^$两个符号代表开头和结尾
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

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

#13

帖子 aerofox » 2012-02-29 18:50

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
头像
Think1st
帖子: 45
注册时间: 2012-02-07 23:08

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

#14

帖子 Think1st » 2012-03-01 9:58

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) - 不匹配括号内的所给模式。
在这里,问题比答案更抢手。
回复