3

文字列も 1 つ以上のスペースで開始および終了するかどうかを確認する方法は?

if [[ $username =~ [^0-9A-Za-z]+ ]]

(基本的に、入力は英数字で、最初でも最後でもスペースを入れず、コンマ、アンダースコア、ハイフンなどを入れないでください)

上記の正規表現は、残念ながら先頭と末尾のスペースには一致しませんが、間のスペースには一致しますか?

awk、sedがなければ、上記の正規表現を修正して先頭と末尾のスペースも一致させる方法はありますか?

前もって感謝します

4

4 に答える 4

4

Bash の正規表現は、引用符を付けるのが難しい場合があります。正規表現のメタ文字を引用符で囲んではいけませんが、シェルでは空白が重要であるため、スペースを引用符で囲む必要があります。この正規表現は、先頭と末尾がスペースの文字列に一致します。

[[ $s =~ ^" ".*" "$ ]] && echo y

文字列にスペースが含まれているかどうかをテストするには、次のいずれかを実行します。

[[ $s =~ [[:space:]] ]] && echo y
[[ $s == *" "* ]] && echo y
于 2012-10-04T22:15:21.763 に答える
1

(基本的に、入力は英数字で、最初でも最後でもスペースを入れず、コンマ、アンダースコア、ハイフンなどを入れないでください)

ええと、私が何かを見逃していない限り...

if ! [[ $username =~ ^[0-9a-zA-Z]+$ ]]
于 2012-10-04T19:34:02.967 に答える
1

これはうまくいくはずです:

if [[ $username =~ "^ [^0-9A-Za-z]+ $" ]]
于 2012-10-04T19:30:04.787 に答える
0

ありがとう@Glennif [[ $username =~ [^0-9A-Za-z]+ ]]これは私の元の正規表現であり、ユーザーに英数字のみを入力してもらいたいです(スペース、アンダースコアなどを含む他のすべては受け入れられません)。無限 while ループ内で読み取りを使用し、有効な入力でのみ終了しています。

正規表現は、英数字以外のすべての文字列と、間にスペースがある文字列にも一致しますが、先頭と末尾のスペースを含むエントリと一致しませんでした (私はそう思いました)。

次に、正規表現ではなく、先頭と末尾のスペースを自動的にトリミングする「読み取り」コマンドに気付いたので、正規表現になるまでに、変数自体がトリミングされました。

「これを回避する秘訣は、IFS (Internal Field Separator) 変数を再定義することです。デフォルトでは、読み取りコマンドの単語を区切るために、IFS はスペース、タブ、および改行文字に設定されています。」このブログから拾ってきた

http://fahdshariff.blogspot.in/2008/06/read-file-without-trimming-leading.html、それに応じてスクリプトを修正しました。

フォローアップして詳細を説明していただきありがとうございます!!

于 2012-10-05T18:05:37.667 に答える