2012-04-11 11 views
1

私は正規表現について少し勉強しようとしています、誰も私にここで何が起こっていることを説明することができますか?期待される出力を提供する正規表現の例を挙げてください。ありがとう!なぜこの貪欲な正規表現は期待どおりに動作しませんか?

input data = 'Sometext|even more text' 

regex = '(.*)?\|?.*' 

replacement = '$1' 

expected output = 'Sometext' 

actual output = 'Sometext|even more text' 

PHP

preg_filter("(.*)?\|?.*", "$1", 'Sometext|even more text'); // returns Sometext|even more text 
+1

PHPコードも追加してください。 – hakre

+0

'\ |?'はまた、垂直バーをオプションにします。 – nickb

答えて

1

(.*)ので、すべてのものと一致して、貪欲です。 $1はすべてです。あなたはおそらく探している

/^([^|]*).*$/ 
+0

そして、貪欲でない(。*)の外観はどうですか? – netbrain

+1

@netbrain: '(。*?)'しかし、match-all演算子を避け、一致させたくない文字を@hakreのように除外する方が良いです。 –

+1

'?'を追加することで欲張りにしません。しかし、私は答えを編集しました。なぜなら、あなたは理解したくないがコードを持っているからです; – hakre

1

あなたの正規表現は、「オプション|が続くすべての文字は、0以上の文字が続く」と言っています。

(.*)([^\|]*)に変更するか、または|をオプションでないものに変更してください。

1

*は貪欲です。つまり、可能な限り多くのテキストを照合しようとします。この場合:

  • (.*)?は、すべてのテキストと一致します
  • \|?.*マッチします "休息"(空文字列)

試してみてください。

1

あなたが(\w+)?\|?.*にあなたの正規表現を変更した場合regex = '\|[^|]*', replacement = ''具体的には、\wの後に+を追加すると、 'Sometext'の期待される回答が得られます。

文字列全体が一致した理由は、最初の.*が文字列全体と一致していたためです。上記の変更によって、あなたはどんな単語の文字にもマッチします。

関連する問題