2016-12-06 16 views
1

正規表現を使用して、プレフィクスのリストと正確に一致する文字列のグループを見つけています。Regex non-greedy exact match

正規表現 ^prefix[^prefix]

を使用して接頭辞A, B, BB

私が一致することができ三つのグループ(Aone Atwo, BBone BBtwo, Bone Btwo

Aone 
Atwo 
BBone 
BBtwo 
Bone 
Btwo 

しかし、私は、文字列を持っている場合、これは壊れ

incd 
incm  
named 
namem 

私のプレフィックスは0123です

namemはキャプチャされません。私はここで何ができるのか?

+2

否定先読みを使用してください。 '^接頭辞(?!接頭辞)'、[サンプルデモ](https://regex101.com/r/X547JM/1)を参照してください。 –

+0

正確な正規表現を使用できますか? – Dekel

+0

@WiktorStribiżewうわー、ありがとう! – luffe

答えて

1

ネゲートされた文字クラスを持つ1つのcharを "否定"するときは、そのクラスで定義されているchar以外のcharが必要です。さらに重要なことは、この方法で1つの文字だけを「無効」にすることができ、のシーケンスの文字ではないことです。

もっと普遍的なアプローチは、否定先読み、(?!...)を使用することです。

^(?:inc|name)(?!(?:inc|name)) 

regex demo

  • ^を参照してください - 試合のいずれかincまたはname
  • (?!(?:inc|name)) - - 文字列が
  • (?:inc|name)を開始合致するincまたはnameリテラル文字シーケンスが存在しないことを主張するの直後またはname
+0

これは本当に役に立ちました、ありがとうalot – luffe

+0

ごめんなさい、もう一度質問しますが、 'BBBoot'を文字列の最初のリストに追加すると'^BB !BB) 'はこの追加にマッチしますが、これも避けられますか? – luffe

+0

(正規表現を '^ BB(?!B)'に変更すると、この一致は正しく削除されますが、これが一般化すればわかりません) – luffe