2017-10-17 20 views
0

「23.0 32.0」のような文字列に一致させようとしています。ここに私の正規表現があります:RegExワイルドカードが一致していない

hrs_pnt_regex = /\s{2,}-?\d{1,2}\.\d(\s+|$)/ 

コード:

x = " 23.0  32.0" 
x.to_enum(:scan, hrs_pnt_regex).map { Regexp.last_match } 

結果:私は気づく何

MatchData " 23.0  " 1:"  " 

は\ sの+が終わり括弧で動作するようには思えないということです。 "\ s \ s"に変更すると、そのように両方の数字が一致します。それ以外の場合は、最初のものだけを取得します。

<MatchData " 23.0 " 1:" ">, <MatchData " 32.0" 1:""> 

+その後?

+0

と一致します。その場合にはxx.yにまねの番号を、マッチさせたいのですか?それは奇妙なことのように思えます。 – tadman

+0

文字列に正規表現をグローバルに適用したいときに、すべてのMatchDataオブジェクトを取得する方法としてこれが見つかりました。それ以外の場合は、文字列の開始位置を与えるオブジェクトがない文字列と一致する文字列を返します。 –

+0

'/ g'フラグで' match'を実行すると、すべての一致が得られます。 – tadman

答えて

1

問題は、(\s+|$)の部分が後続の一致で開始部分を識別するスペースを消費していることです。基本的には、次のラウンドを妨害して、すべてのスペースをゴブリングし、3の位置にあるポインタを32.0の先頭に置きます。彼らが最初の試合の一部とみなされている限り、2回目の試合では利用できません。

簡単な修正は次のとおりです。

x.scan(/\s{2,}(-?\d{1,2}\.\d)/) 
# => [["23.0"], ["32.0"]] 
0

ここで行うための最善のことは、オンライン正規表現マッチャーを使用することです。私のお気に入りはRegExrです。私はあなたの説明から伝えることができます

ベストは、あなたが `ここ.to_enum`なぜ

hrs_pnt_regex = /\d{2,}\.\d{1,2}/ 

は両方のセット、23.032.0

関連する問題