2016-12-15 13 views
0

これについて複数の投稿を見てきましたが、まだ問題があります。正規表現クエリの否定

ではないS3バケットの名前を検索する正規表現クエリを作成しようとしていますが、の名前付け方式に従っています。次のように私たちが望むスキームは次のとおりです。

テスト・バケット・ログ** - 私たち-東-1 **

太字の部分はオプションです。

  1. テスト・バケット・ログ
  2. テスト・バケット・ログ-US--東1今

、私が何をしたいのかがさ:意味は、次の2つは、有効なバケット名がありますこれを否定します。だから私は上記の計画に従わないすべてのバケツをキャッチしたい。私はネーミングスキームに合致するクエリーを正常に作成しましたが、それを否定する問題が発生しています。正規表現は以下の通りです:

^(.*-bucket-logs)(-[a-z]{2}-[a-z]{4,}-\d)?$

だから、いくつかのより有効なバケット名:

  1. 例-バケットログ-AP-北東-1
  2. 何か-バケットログ-EU-中央-1

無効なバケット名(私たちはこれらを一致させたい):

  1. Iscrewedthepooch
  2. テスト・バケット・ログ-US-EE
  3. バケットログ-US-東-1

が助けてくれてありがとう。

+0

正規表現を否定することは一般的に難しいです。否定的な先読みを使用するか、一致を実行するコードの否定を行います。一致するアイテムを削除する代わりに削除します。 – Barmar

+0

コード内の結果を否定することは、私が行っていくことです。ありがとうございました! –

答えて

2

mr Barmar氏によると、おそらくこのような状況での最良のアプローチはプログラム的に解決しています。正しいパターンにマッチさせるために通常の正規表現を書いて、それらをコレクションから除外することができます。

しかし、あなたはこれを試すことができます。

^(?:.(?!-bucket-logs-[a-z]{2}-[a-z]{4,}-\d|-bucket-logs$))*$ 

負lookeaheadを使用して、一般的な解決策長さがゼロで非キャプチャグループ、です(?!)。基本的には、何かで始まるすべての行を必要としていますが、後にパターンはありません。

EDITED

イブラヒムは(ありがとう!)を指摘したように、私の最初の正規表現ではほとんど問題がありました。私はそれを修正し、それは今は大丈夫だと思う。私は内部正規表現の最後の部分をオプション(?)として設定するのを忘れていました。

+1

有効なバケット名である 'test-bucket-logs'にマッチします。これを除外するために例外を追加することを検討してください: '^(?:。! - バケットログ - [az] {2} - [az] {4、} - \ d | -bucket-logs $ ))* $ ' – Ibrahim

+0

私はそれを修正しました。ありがとう、男! –