2016-11-06 17 views
1

私は以下の文字列を持っています:find me String1\String2\String3、私はそれらが存在する場合、string1,2,3をキャプチャしたいと思います。 String 3はオプションです。オプションの開始文字と終了文字を含むグループをキャプチャします

はこれまでのところ、私は何を作ることができることである:(?<=find me)\s(\\?[\w]+\\?){1,3}、私の前提だった:

  • 文字列がbegginingでfind meを持つ必要がありますが、それは
  • 空白
  • でグループを捕獲するべきではありません\は、文字列の後ろに続く文字列であり、末尾に\という文字列があります。オプションでも1から3回表示されます。

正規表現のパターンに問題がありますか?

+0

正規表現の味は何ですか? – anubhava

+0

最後の一致、つまり 'String3'のみが2番目のキャプチャグループで使用可能になります。 – anubhava

+0

@anubhava私は実際に知りません、私はPHPでそれをやっています。 –

答えて

1

あなたの正規表現の風味が\Gをサポートしていますと仮定すると、あなたは別に、すべての3つの文字列をキャプチャするために、この正規表現を使用することができます。

(?<=find me |(?<!^)\G\\)\w+ 

RegEx Demo

\Gは、前の試合終了または開始時の位置をアサート最初の一致の文字列。

\Gは、前の一致の行開始または終了のいずれかの位置に一致します。この場合、私はまた負のlookbehind (?<!^)を持っています。これは、行の開始と一致しないことを意味します。したがって、\Gは前の一致の終わりの位置にのみ一致します。たとえば、末尾がString1、末尾がString2の2回に一致します。

+0

私にこれを説明できますか?(?<!^)\ G \\ '。私はそれが本当に何を理解できませんでした。 –

+0

'\ G'は、前の一致の行開始または終了のいずれかの位置に一致します。この場合、私はまた、ライン開始と一致しないことを意味する負のlookbehind '(?<!^)'を持っているので、 '\ G'は前のマッチの終わりの位置だけにマッチします。あなたの例では、これは2回、すなわち 'String1'の終わりと' String2'の終わりにマッチします。 – anubhava

関連する問題