2017-10-25 1 views
1

私は単一のドットとファイル名を持つファイル名を検証する正規表現を構築しようとしていますが三つの部分に下線正規表現は、これは以下の私の正規表現である

で区切られた単一のドットでファイル名を受け入れ入力文字列

ABA_ABA_2015_478.csvは -

ABA_ABA_2015478.js.csvを故障した場合 -

を故障した場合0

ABC_BCD_XYZ.js - 合格する必要があります

私にこれを手伝ってください。

+1

'^(? [^ _] *)_(? [^ _] *)_(? [^ _] *)\。[^ _] * $ ' –

答えて

0

あなたは、この正規表現を使用することができます。

正規表現の分裂:

  • ^
  • (?<appname>[^_.]+)を開始します。マッチとグループ_とドット
  • (?<eventtype>[^_.]+)ない長さ1+の任意の文字:マッチとグループ1の任意の文字+長さは_ではなく、ドット
  • __
  • (?<counter>[^._]*):マッチとグループ_とドットではありません1+長さの任意の文字
  • \.
  • $に点在されていない1+長さの任意の文字にマッチ:エンド
  • ドット
  • [^.]+と一致Javaの使用のための

final String re = "^(?<appname>[^_.]+)_(?<eventtype>[^_.]+)_(?<counter>[^._]*)\\.[^.]+$"; 
+0

申し訳先生、あなたは遅れている、とも間違った:)私はまだ左の部分からもドットを取り除くことで前進しています。ニースのデモのtho、私はそれをたくさん使って覚えています。 – Vlasec

+1

さて、左の部分にはまだドットを入れることができます。appnameまたはeventtypeに表示する必要がありますが、実際に問題が発生する可能性が最も高いカウンタから実際に削除しました。 – Vlasec

+0

ありがとう、良い点 – anubhava

0

正規表現では、ドット文字は「任意の文字」を意味します。バックスラッシュを使用してエスケープする必要があります(Javaでは、Java文字列でバックスラッシュ自体をエスケープするためにバックスラッシュを倍にする必要があります)。だから、

、右部分は、\.\w+ような何かを行うことができ、あなたもドットを追跡するためにいくつかの文字をしたい場合。また、左の部分では、部品からドットを除外します - [^_.]*(または空でない場合は[^_.]+)。あなたはJavaでmatches()メソッドを使用している場合、あなたはアンカーが暗黙的としてアンカーを使用する必要はありません

^(?<appname>[^_.]+)_(?<eventtype>[^_.]+)_(?<counter>[^._]*)\.[^.]+$ 

RegEx Demo