私は使用します:
str = "Hello A=[apple] B=[boy] World"
str[/A=\[(.*?)\]/, 1] # => "apple"
str = "Hello A=[] B=[boy] World"
str[/A=\[(.*?)\]/, 1] # => ""
を使用している理由がわかりません。A*=*
これは、「0 個以上の 'A' の後に 0 個以上の '=' が続く」ことを意味し、基本的に何も役に立たず、実際には返される穴が開いているためです。悪い結果。以下の編集で追加情報を参照してください。
以下は、同じテーマのバリエーションです。すべて正規表現とString.[]
ドキュメントに記載されています。
str = "Hello A=[apple] B=[boy] World"
str[/A=\[(.*?)\]/, 1] # => "apple"
/A=\[(.*?)\]/ =~ str
$1 # => "apple"
str =~ /A=\[(.*?)\]/
$1 # => "apple"
/A=\[(?<in_brackets>.*?)\]/ =~ str
in_brackets # => "apple"
str = "Hello A=[] B=[boy] World"
str[/A=\[(.*?)\]/, 1] # => ""
/A=\[(.*?)\]/ =~ str
$1 # => ""
/A=\[(?<in_brackets>.*?)\]/ =~ str
in_brackets # => ""
=は、等号の前後にある可能性のあるスペース文字と一致させることを意図していました。たとえば、str = "Hello A= [] B=[boy] World" です。
まあ、*=*
あなたがそれをすべき方法ではありません。何がオプションかを正規表現エンジンに伝える必要があります。
/A *= */
次のように正しいでしょう:
/A ?= ?/
何が起こっているかを示すためのいくつかのテストを次に示します。
str = "Hello [foo] A = [apple] B=[boy] World"
str[/A*=*\[(.*?)\]/, 1] # => "foo"
str[/A *=*\[(.*?)\]/, 1] # => nil
str[/A *= *\[(.*?)\]/, 1] # => "apple"
str[/A ?= ?\[(.*?)\]/, 1] # => "apple"
このパターン/A*=*/
では、エンジンが[foo]
ではなくに一致することに注意してくださいA = [apple]
。これは、オプションとしてnoA
と noを一致させるように指示しているためです。これにより、 をつかむ穴が開きます。入力が正確に 2 つのオプションであり、括弧内に値が先行していない限り、安全です。それを入力すると、結果は間違ったものになります。=
[foo]
str[/A.*=.*\[(.*?)\]/,1]?
いいえ:
str = "Hello A=[apple] B=[boy] World"
str[/A.*=.*\[(.*?)\]/,1] # => "boy"
Rubular経由で正規表現を使用する方法を調べることをお勧めします。上記の例と失敗する理由を示すリンクを次に示します。