=~演算子を使用して、curl 応答文字列に対して正規表現パターンを実行しようとしています。
現在使用しているパターンは次のとおりです。
name\":\"(\.[a-zA-Z]+)\"
ただし、現在、このパターンは文字 az と AZ のみを含む値のみを抽出します。「。」を含む値も取得するには、このパターンが必要です。文字と「@」文字。どうすればいいですか?
また、このパターンのパフォーマンスを向上させる方法はありますか? 文字列に対して実行するにはかなりの時間がかかります。
乾杯。
私は最近、自分の git ステータスに従って bash プロンプトを設定するスクリプトでこの問題に遭遇しました。これは、式内で一致させたい他のもの (つまり、ハイフン) の配置が原因であることがわかりました。
git statusたとえば、出力の特定の部分、たとえば、それが言う部分を一致させたいと思っていました"Your branch is ahead of 'origin/mybranch' by 1 commit."
これは私の元のパターンでした:
"Your branch is (ahead of|behind) '([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)' by ([0-9]+) commit".
ある日、 を含むブランチを作成した.ところ、bash プロンプトが正しいものを表示していないことがわかり、式を次のように変更しました。
"Your branch is (ahead of|behind) '([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-.]+)' by ([0-9]+) commit".
うまくいくと思っていましたが、まったく一致しませんでした。
たくさんの投稿を読んだ後、ハイフン ( -) の配置が原因であることに気付きました。最初の角括弧の直後に配置する必要がありました。そうしないと、範囲として解釈されます (この場合、 の範囲を解釈しようとしましたが_-.、これは無効であるか、何らかの形で式全体が失敗します。
式を次のように変更すると、機能し始めました。
"Your branch is (ahead of|behind) '([a-zA-Z0-9_-]+)/([-a-zA-Z0-9_.]+)' by ([0-9]+) commit".
つまり、基本的に、ドットとアンパサンドの一致を妨げているのは、あなたの式の他の何か (私のハイフンのようなもの) である可能性があるということです。
作業例のスクリプト:
#!/bin/bash
regex='"name":"([a-zA-Z.@]+)"'
input='"name":"internal.action.retry.queue@temp"'
if [[ $input =~ $regex ]]
then
echo "$input matches regex $regex"
for (( i=0; i<${#BASH_REMATCH[@]}; i++))
do
echo -e "\tGroup[$i]: ${BASH_REMATCH[$i]}"
done
else
echo "$input does not match regex $regex"
fi
ドット ('.') とアットマーク ('@') を追加するだけです:
name\":\"(\.[a-zA-Z.@]+)\"
URL の先頭に必須のドットが必要ない場合は、次を使用します。
\"name\":\"([a-zA-Z.@]+)\"