アイデアは、URLの入力パターンの基本的なチェックを行うことです。
$ ns='abc.def.com'
$ reg_expr="\N*\.(\D{2}|\D{3})$"
$ echo $reg_expr
\N*\.(\D{2}|\D{3})$
$ [[ $ns =~ "$reg_expr" ]] && echo "ok" || echo "no"
no
しかし、正規表現は常に失敗します。同じパターンのオンライン正規表現チェックが正しく機能します。
https://regex101.com/r/vXxv1w/1
なぜこれが起こるのですか?
ベストアンサー1
それ
\N*\.(\D{2}|\D{3})$
Perl 正規表現です。 bashの[[ =~ ]]
演算子は、Perl正規表現ではなくPOSIX拡張正規表現を使用します。
Perl スタイルの正規表現を使用するには、zsh とそのrematchpcre
オプションを使用します。
set -o rematchpcre
[[ $ns =~ '\N*\.(\D{2}|\D{3})$' ]]
今、この正規表現はあまり意味がありません。
\N
改行を除くすべての文字と一致するように設計されていますが、フラグを設定しない限り()を使用して、改行s
は一致しないために置き換えることができます。(?s)
.
\N
.
<anything>*
一致するため、正規表現の始まりまたは終わりにあることは意味がありません。0またはmore<anything>
なので、何も一致しません。[[ $ns =~ '\.(\D{2}|\D{3})$' ]]
機能的に同じです。\D
10進数(例:0123456789または0123456789٠١٢٣٤٥٦٧٨٩0123356789ot German)を除くすべての文字と一致します。 ८ ८ ८ ০১২৩৪৫৬৭৮৯੦੧੨੩੪੫੬੭੮੯૦૧૨૩૪૫૬૭૮૯ ९ ୭ ୭ ൯ ෦෧෨෩෪෫෬෭෮෯ ๐๑๒๓๔๕๖๗๘๙໐໑໒໓໔໕໖໗໘໙༠༡༢༣༤༥༦༧༨ ๐๑๒๓๔๕๖๗๘๙໐໑໒໓໔໕໖໗໘໙༠༡༢༣༤༥༦༧༨ ༩၀၁၂၃၄၅၆၇၈၉႐႑႒႓႔႕႖႗႘႙០១២៣៤៥៦៧៨៩᠐᠑᠒᠓᠔ ᠕᠖᠗᠘᠙ ᠕᠖᠗᠘᠙ ᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏ ᧑᧒᧓᧔᧕᧖᧗᧘᧙᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉᪐᪑᪒᪓᪔᪕ ᪖᪗᪘᪙᭐ ᭑᭒᭓᭔᭕᭖᭗᭘᭙᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉᱐᱑᱒᱓᱔᱕ ᱖᱗᱘᱙꘠꘡ ᱖᱗᱘᱙꘠꘡ KR 0123456789