-2

javascript で 2 回目の一致を抽出する正規表現を作成しています。私の意図した抽出は、「root_first_attributes_0_second_」の直後にある「attributes_」です。例については、以下のコード スニペットを参照してください。

template = "root_first_attributes_0_second_attributes_0_third_attributes_0_third_name"

my regex
==========
var n = template.match(/(attributes[_\]\[]+)\d+/g)

構成された正規表現は、一致するパターンのすべての出現を返すため、意図したとおりに機能しません。つまり、そのうちの 3 つが返されます。

アドバイスをいただければ幸いです。

4

1 に答える 1

1

説明

javascriptで動作する正規表現の次のpowershellの例を考えてみましょう(または、http://www.pagecolumn.com/tool/regtest.htmで動作しました。正規表現グループの戻り値 $1 には、属性領域に値の部分文字列が含まれます2番目のオプションの ソーステキストを変更して、属性サブストリング内のアンダーバーも検出されることを示しました。

^.*?_0_[^_]*[_](.*?)(_0_|$)

$Matches = @()
$String = 'root_first_attributes_0_second_Attributes_ToVoteFor_0_third_attributes_0_third_name'
Write-Host start with 
write-host $String
Write-Host
Write-Host found
([regex]'^.*?_0_[^_]*[_](.*?)(_0_|$)').matches($String) | foreach {
    write-host "key at $($_.Groups[1].Index) = '$($_.Groups[1].Value)'"
    } # next match

収量

皮切りに: root_first_attributes_0_second_Attributes_ToVoteFor_0_third_attributes_0_third_name

31 = 'Attributes_ToVoteFor' にキーが見つかりました

概要

  • ^文字列の先頭から
  • .*?到達する文字数が最小になるように移動する
  • _0_最初の区切り文字
  • [^_]*次に、アンダーバー以外の次の文字に移動します
  • [_]最初のアンダーバーを読むまで
  • (.*?)前にすべての文字をキャプチャして返す
  • (_0_|$)次の区切り文字または文字列の終わり

エクストラクレジット

リスト内の X 番目のグループの属性フィールドをキャプチャするには、非貪欲な検索を非キャプチャ ブロックに続けてカウントすることにより、正規表現を変更できます。これらはwww.pcreck.com/JavaScript/advancedでテストできます。

  • ^(?:.*?_0_){0}[^_]*[_](.*?)(?=_0_|$)一致するfirst_attributes
  • ^(?:.*?_0_){1}[^_]*[_](.*?)(?=_0_|$)一致するAttributes_ToVoteFor
  • ^(?:.*?_0_){2}[^_]*[_](.*?)(?=_0_|$)一致するattributes
  • ^(?:.*?_0_){3}[^_]*[_](.*?)(?=_0_|$)一致するname
于 2013-05-12T14:35:20.350 に答える