범위 내의 단일 숫자를 확인하는 정규식 패턴은 무엇입니까? 테스트할 때 작동하는 것으로 보이는 다음 패턴을 시도하고 있습니다
https://regex101.com/
.
패턴:\b([0-5])\b
예상되는 결과:
입력: 2 출력: OK
입력: 5 출력: OK
입력: 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
Cohen 스타일 대안:
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))