2

以下の例では、私が何をしているのかわかりません。私の観点では似ている2つの文字列があります-プレーンな文字列です。文字列ごとに正規表現がありますが、最初の正規表現 は/\*Hi (.*) \*,/、正規表現の一致が 2 つの配列で示される結果を返します[["result"]]。結果を 1 つの配列で表示する必要があります: ["result"]。以下の 2 つの例では、何が違うのですか?

✗ irb
2.0.0p247 :001 > name_line_1 = "*Hi Peter Parker *,"
 => "*Hi Peter Parker *," 
2.0.0p247 :002 > name_line_1.scan(/\*Hi (.*) \*,/)
 => [["Peter Parker"]] 
2.0.0p247 :003 > name_line_2 = "Peter Parker<br />Memory Lane 60<br />0000 Gotham<br />USA<br />TEL:: 00000000000<br /><a href=\"mailto:peter5064@parker.com\">peter@parker.com</a><br />\r"
 => "Peter Parker<br />Memory Lane 60<br />0000 Gotham<br />USA<br />TEL:: 00000000000<br /><a href=\"mailto:peter5064@parker.com\">peter@parker.com</a><br />\r" 
2.0.0p247 :004 > name_line_2.scan(/^[^<]*/)
 => ["Peter Parker"]
4

3 に答える 3

3

これは、括弧を使用して name_line_1 の名前をキャプチャしているためです。これにより、scan メソッドは配列の配列を返します。絶対に 1 次元配列を返す必要がある場合は、次のように前方および後方チェックを使用できます。

/(?<=\*Hi ).*(?= \*,)/

または、それがあまりにも混乱している場合は、結果の配列をいつでも呼び出すことができます.flatten;-)

于 2013-07-18T11:09:52.710 に答える
3

scan一致の配列を返します。他の回答が指摘しているように、正規表現にキャプチャ グループ (括弧) がある場合、一致は配列を返し、一致内のキャプチャ グループごとに 1 つの文字列を返します。

これを行わなかった場合scan、正規表現でキャプチャ グループを使用して一致のさまざまな部分を選択することは非常に一般的であるため、あまり役に立ちません。

それscanはあなたの状況にとって本当に最善の方法ではないと思います。文字列からすべての一致scanを取得する場合に便利です。しかし、あなたが示した文字列には、とにかく1つしか一致しません。文字列の最初の一致から特定のキャプチャ グループを取得する場合、最も簡単な方法は次のとおりです。

 string[/regex/, 1] # extract the first capturing group, or nil if there is no match

別の方法は、次のようにすることです。

 if string =~ /regex/
   # $1 will contain the first capturing group from the first match

または:

 if match = string.match(/regex/)
   # match[1] will contain the first capturing group

文字列内のすべての一致を取得する必要があり、キャプチャ グループを使用する必要がある場合 (または、先読みと後読みを使用するよりも読みやすいと感じる場合):

 string.scan(/regex/) do |match|
   # do something with match[0]
 end

または:

 string.scan(/regex/).map(&:first)
于 2013-07-18T11:54:13.323 に答える
0

違いは、最初の正規表現でsubstring をキャプチャした ()ことです。正規表現が一致すると、一致全体が としてキャプチャされ$&ます。さらに、 を使用して、必要なだけその一部をキャプチャできます()$1$2、 ...としてキャプチャされます。

, , ...scanを持っているかどうかによって動作が異なります。持っていない場合は、すべての の配列を返します。, , ...がある場合は、 の配列を返します。$1$2$&$1$2[$1, $2, ...]

最初の正規表現で回避$1するには、キャプチャされた部分文字列を使用しないようにする必要があります。

于 2013-07-18T11:09:59.460 に答える