2017-07-18 18 views
2

私はこれは私がこれまで持っているものである私の正規表現が?ver?vを一致させたいが、ない?version正規表現マッチ正確な言葉

$parts = preg_split("(\b\?ver\b|\b\?v\b)", $src);

私はトラブルは、私が?を逃れる方法かもしれないと思います。

+0

2人または3人のサンプル入力を追加して、今後のSOリーダーがあなたの文脈で尋ねる内容を確認できるようにしてください。 – mickmackusa

+0

「厳密な単語」と呼ばれるものは、特に「?」は単語文字ではないため、あまり明確ではありません。単語の正確な範囲を説明する必要があります。 –

+0

@mickmackusa:それは問題ではありません、それはいつも不明です(幸いにも!)。 –

答えて

6

あなたのパターンは、単語charの前にある?と一致するように試みます。パターンがないので、一致しません。

は、次のパターンを使用します。

  • \? - リテラル文字?
  • v(?:er)?から:

    '/\?v(?:er)?\b/' 
    

    regex demo

    パターンがの詳細を参照してください。またはver

  • \b - 単語境界(つまり、 vまたはverの後には、数字以外の文字(数字、文字または_でない)または文字列の末尾が必要です。それは?(非単語文字)とv(ワード文字)の間に、すでに存在しているとして、あなたが最初の(初期)ワード境​​界を必要としない

注意。 ?がオプションの場合は、そこに単語境界が必要です。

5

次の正規表現パターンを試してください。

(\?v(?:\b|(?:er(?!sion)))) 

Demo

これは?ver?vを許可しますが、?verがあなたのケース?versionのように、sionが続いている場合は、一致防ぐために、負の先読みを使用します。

+0

対象となる部分文字列が行末で終了することをどのように知っていますか?あなたのパターンは実際には間違っているかもしれませんが、OPがいくつかのサンプル文字列を提供するまではわかりません。これはWiktorの正しいパターンには関係ありません。 – mickmackusa

+0

OPはサンプルの文字列を提供しました。「正規表現で '?ver'と'?v'をマッチさせますが、 '?version'ではマッチさせません。 –

+0

しかし、OPが意味するものであり、それが非常にうまく表現されていないという偶然の可能性については、元の解決策を無償で提供しているので、今私の答えを編集しました。それを指摘してくれてありがとう! :) –