0

A=[と最初の囲みの間の何かを取得したい]:

> str = "Hello A=[apple] B=[boy] World"
> str.match(/A=\[(.+?)\]/)[1]
 => "apple" 

ここまでは順調ですね。

ただし、次の場合A=[]:

> str = "Hello A=[] B=[boy] World"
> str.match(/A=\[(.+?)\]/)[1]
 => "] B=[boy" 

""の代わりに空の文字列を取得するにはどうすればよい"] B=[boy"ですか?

4

2 に答える 2

4

.*?ではなく使用し.+?ます。前者は 0 個以上の文字に一致し、後者は 1 個以上の文字に一致します。

"Hello A=[] B=[boy] World".match(/A*=*\[(.*?)\]/)[1] # => ""
于 2013-07-09T08:45:43.353 に答える
3

私は使用します:

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経由で正規表現を使用する方法を調べることをお勧めします。上記の例と失敗する理由を示すリンクを次に示します。

于 2013-07-09T08:52:35.437 に答える