1

私はそのような文字列 "++++001------zx.......?????????xxxxxxx" を持っています。 Ruby 正規表現を使用したフラット化された配列:

["++++",
"00",
"------",
".......",
"?????????",
"xxxxxxx"]

ネストされたループでこれを実現できます。

s="++++001------zx.......?????????xxxxxxx"
t=s.split(//)
i=0
f=[]
while i<=t.length-1 do
  j=i
  part=""
  while t[i]==t[j] do
    part=part+t[j]
    j=j+1
  end
  i=j
  if part.length>=2 then f.push(part) end
end

しかし、スキャン メソッドにフィードする適切な正規表現が見つかりません。私はこれを試しました:s.scan(/(.)\1++/x)しかし、繰り返しシーケンスの最初の文字のみをキャプチャします。それはまったく可能ですか?

4

3 に答える 3

3

これは少しトリッキーです。

特定のキャラクターの複数のグループをキャプチャする必要があります。したがって、これを行う良い方法は、後方参照を使用することです。あなたの解決策はほぼ正しいです。

/((.)\2+)/トリックを行う必要があります。

スキャンを使用する場合、一致グループごとに 2 つの値が返されることに注意してください。1 つ目はシーケンスで、2 つ目は値です。

于 2013-07-24T19:13:00.893 に答える
0

String#matchJavaScript での動作と同様に、すべてのキャプチャ グループ値を無視 (省略) しながら全体的な一致値のみを取得する必要がある場合は、単一の正規表現引数 (置換引数なし) でString#gsubを使用して、 Enumeratorを返すことができます。.to_a一致の配列を取得するには:

text = "++++001------zx.......?????????xxxxxxx" 
p text.gsub(/(.)\1+/m).to_a
# => ["++++", "00", "------", ".......", "?????????", "xxxxxxx"]

オンラインの Ruby デモRubular デモを参照してください([一致結果] フィールドで一致がどのように強調表示されているかに注意してください)。

デフォルトでは一致しない改行文字にも一致mするように、完全を期すために修飾子を追加しました。..

また、関連する「Capturing groups do not work as expected as with Ruby scan method thread」も参照してください。

于 2021-02-14T20:01:43.983 に答える