2017-03-16 7 views
2

これは私のテキストです:マッチオールパーツですべての正規表現マッチを見つけるには?

["hello foo-1", "hello bar $4", ...] 

これを達成するためにscan()に供給する正規表現とは何か:

hello foo-1 hello bar $4 hello ... 

私は/hello .*/に一致するすべてのものを見つける必要がありますか?

+1

'ハロー\ + S *(?=ハロー| $)' https://regex101.com/r/OCbf83/1 –

+0

@AvinashRaj、その答えをしてください。 –

答えて

3

使用先読み基づいて正規表現とsplit(?=hello)肯定先読みは、文字列内の各helloの前に位置で文字列を分割します

'hello foo-1 hello bar $4 hello'.split(/(?=hello)/) 

あなたは、パターンの開始時に\s*を追加末尾の空白(もしあれば)を取り除くために必要がある場合:

.split(/\s*(?=hello)/) 

Rubular demoonline Ruby code demoを参照してください。

+0

私は、 ''スキャン 'の解決策を使って編集しようとしていました - ['s.scan(/ hello(?:hello))*/m)'](https://ideone.com/EdxdrH)私はまだ「分割」が正しいと信じています。 –

+0

これは "hello"と "helloween"を区別しません。また、「hello」以外の文字列で始まる文字列も許可されません(たとえば、「hello ...」など)。この例以外にも、OPはその可能性を否定していましたが、 'scan'を使用すると問題はありません。 –

+0

@Cary単語境界を追加することはロケット科学ではありません。このソリューションは、それ以上の要件に対応するのに十分な柔軟性を備えています。 –

0

正規表現のない別の方法があります。それはslice_beforeを使用しています。?

"hello foo-1 hello bar $4 hello".split.slice_before("hello").map{|words| words.join(' ')} 
# => ["hello foo-1", "hello bar $4", "hello"] 
"hello helloween hello halloween".split.slice_before("hello").map{|words| words.join(' ')} 
# => ["hello helloween", "hello halloween"] 
+0

上記の私のコメントも同様に適用されます。 –

+0

@CarySwovel私はそれが分からない: '' hello helloween hello halloween ".split.slice_before(" hello ")。map {| words | words.join( '') '' returns '[" hello helloween "、" hello halloween "]' –

+0

@CarySwoveland: "hello"と言うと、それはセパレータに問題があります。何とかそれをエスケープする必要があります。 –

関連する問題