3

=~演算子を使用して、curl 応答文字列に対して正規表現パターンを実行しようとしています。

現在使用しているパターンは次のとおりです。

name\":\"(\.[a-zA-Z]+)\"

ただし、現在、このパターンは文字 az と AZ のみを含む値のみを抽出します。「。」を含む値も取得するには、このパターンが必要です。文字と「@」文字。どうすればいいですか?

また、このパターンのパフォーマンスを向上させる方法はありますか? 文字列に対して実行するにはかなりの時間がかかります。

乾杯。

4

3 に答える 3

4

私は最近、自分の 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". 

つまり、基本的に、ドットとアンパサンドの一致を妨げているのは、あなたの式の他の何か (私のハイフンのようなもの) である可能性があるということです。

于 2017-05-19T15:16:39.640 に答える
2

作業例のスクリプト:

#!/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
于 2013-03-05T15:17:18.317 に答える
0

ドット ('.') とアットマーク ('@') を追加するだけです:

name\":\"(\.[a-zA-Z.@]+)\"

URL の先頭に必須のドットが必要ない場合は、次を使用します。

\"name\":\"([a-zA-Z.@]+)\"
于 2013-03-05T14:51:08.840 に答える