1

文字列の各行から 3 つの一致を取得したい:

m&tch1@ match2@  match3canbe&ny7hing
match2@          match3canbe&ny7hing
  • 一致 1 は、空白以外であれば何でもかまいません。常に @ で終わるとは限りません。
  • マッチ 1 が存在する場合、マッチ 2 とはスペースで区切られます (スペースはマッチの一部ではありません)。
  • マッチ 2 は常に通常の単語であり、常に @ で終わります
  • マッチ 3 はなんでもあり

したがって、上記から、私は欲しい:

Match 1
1.  m&tch1@
2.  match2
3.  match3canbe&ny7hing
Match 2
1.  
2.  match2
3.  match3canbe&ny7hing

私はこれを思いつきました:/^(\S*@?) ?(\w+)@ +(.+)/しかし、それは戻ります:

Match 1
1.  m&tch1@
2.  match2
3.  match3canbe&ny7hing
Match 2
1.  match
2.  2
3.  match3canbe&ny7hing

マッチ 1 は問題ありませんが、マッチ 2 では最初のグループを空にし、2 番目のグループを「match2」にする必要があります。

正規表現だけではできない場合、他の提案はありますか?

UPD: sawaのソリューションは機能しますが、行の前にタブなどを付けると:

prefix m&tch1: match2: match3canbe&ny7hing
prefix match2: match3canbe&ny7hing

次のようにスキャンし/^prefix (\S*)\s+(\S*):\s+(\S+)/ ます。1行だけスキャンします

現在: http://rubular.com/r/expKw59fF2
プレフィックス付き (まだ動作していません): http://rubular.com/r/VWGgU1qNWA

4

1 に答える 1

1
string.scan(/(\S*)\s+(\S*)@\s+(\S+)/)

戻り値:

[
  [
    "m&tch1@",
    "match2",
    "match3canbe&ny7hing"
  ],
  [
    "",
    "match2",
    "match3canbe&ny7hing"
  ]
]
于 2013-02-23T22:51:47.717 に答える