用于检查某个范围内的单个数字的正则表达式模式是什么?我正在尝试以下模式,该模式在测试时似乎有效
https://regex101.com/
。
模式:\b([0-5])\b
预期结果:
输入:2 输出:好的
输入:5 输出:好的
输入:6 输出:无
输入:22 输出:无
test$ ch=2
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$ ch=6
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$ ch=62
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$ ch=0
test$ [[ $ch =~ \b([0-5])\b ]] && echo "ok" || echo "no"
no
test$
我也尝试过双回:
test$ ch=2
test$ [[ $ch =~ \\b[0-5]\\b ]] && echo "ok" || echo "no"
no
test$ [[ $ch =~ \\b([0-5])\\b ]] && echo "ok" || echo "no"
no
就我而言,bash总是给出“不”。为什么它会这样?
答案1
要验证它$ch
是 ASCII 数字0
、1
、2
、3
、4
或中的任意一个5
,请使用:
可移植(
sh
语法):case $ch in ([012345]) echo OK;; (*) echo not OK;; esac
科恩风格的替代方案:
if [[ $ch = [012345] ]]; then echo OK then echo not OK fi
做不是use ranges such as for input validation as (depending on system and locale) that tends to include many other characters that happen to sort between 0 and 5 beside 012345 such as ٠١٢٣٤۰۱۲۳۴߀߁߂߃߄०१२३४০১২৩৪੦੧੨੩੪૦૧૨૩૪୦୧୨୩୪௦௧௨௩௪౦౧౨౩౪౸౹౺౻౼౽౾೦೧೨೩೪൦൧൨൩൪෦෧෨෩෪๐๑๒๓๔໐໑໒໓໔༠༡༢༣༤༪༫༬༭༳၀၁၂၃၄႐႑႒႓႔፩፪፫፬០១២៣៤៰៱៲៳៴᠐᠑᠒᠓᠔᥆᥇᥈᥉᥊᧐᧑᧒᧓᧔᧚᪀᪁᪂᪃᪄᪐᪑᪒᪓᪔᭐᭑᭒᭓᭔᮰᮱᮲᮳᮴᱀᱁᱂᱃᱄᱐᱑᱒᱓᱔⁰⁴₀₁₂₃₄⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅛⅜⅟↉①②③④⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓾⓿❶❷❸❹❿➀➁➂➃➉➊➋➌➍➓〇〡〢〣〤㉈㉉㉊㉋㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㋀㋁ ㋂㋃㋉㋊㋋㍘㍙㍚㍛㍜㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㏠㏡㏢㏣㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳ ㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽ ㏾꘠꘡꘢꘣꘤꣐꣑꣒꣓꣔꤀꤁꤂꤃꤄꧐꧑꧒꧓꧔꧰꧱꧲꧳꧴꩐꩑꩒꩓꩔꯰꯱꯲꯳꯴01234[0-5]
答案2
由于您的表达式会受到 bash 扩展的影响,因此会在检查正\b
则表达式之前将其扩展(尝试)。而且似乎没有必要使用捕获组。b
ch=b4b
您可以先将表达式放入变量中,如下所示:
exp='\b[0-5]\b'
[[ $ch =~ $exp ]]
然而,对于这样的事情,我更喜欢使用算术运算符:
[[ $ch -gt 0 && $ch -lt 6 ]]
或者
((ch>0&&ch<6))