2016-04-22 10 views
1

ファイル名を特定のパターンに従って解析しようとしていますが、完全一致できません。ここではサンプルファイル名です:正規表現でJavaでファイル名を解析する

CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.doc 

そして、ここでは私の要件は次のとおりです。

文字#ゴマファイル名が#後、何かを含めることができ、私は分離する文字_または文字-を見つけなければなりません文字列。文字の間の文字列(任意に_または- - 両方ではない)には、他の文字を含めることができます。だから、最終的に文字#の後に私はちょうど3つ(_)または-文字を組み合わせる必要があります。文字列は、.docまたは.docxまたは.odtで終了する必要がありますが、.ok.docまたは.ok.docxまたは.ok.odtではありません。

(.*)#([^_-]+)[_-]([^_-]+)[_-]([^_-]+)[_-]([^_-]+)\.[doc|odt|docx].*(?<!\.ok)$ 

しかし、これは.doc.okまたは.docs.okまたは.docx.okで文字列を終了するために私を強制し、実際に私は最後にファイルの拡張子を保持したい:ここ

は、私が試したものです。

私はこのしようとした場合:

(.*)#([^_-]+)[_-]([^_-]+)[_-]([^_-]+)[_-]([^_-]+)\..*(?<!ok\.[doc|odt|docx])$ 

それ文句を言わない仕事を。

ご協力いただければ幸いです。ありがとう:)

+1

構文 '[DOC | ODT | docxファイル]'あなたはそれがないと思うように見える何をしません。 '[?]'を非キャプチャグループに置き換えてみてください: '(?:)' – jsheeran

+1

[( "^#] *#[^ -_] *)[-_](。*)$( ?:(?<=(?<!\\。ok)\\。docx $)|(?<=(?<!\\。ok)\\。doc $) \\。ok)\\。odt $)) "'](https://regex101.com/r/eH3wY2/1) –

+0

@WiktorStribiżewhttp://www.ocpsoft.org/tutorials/regular-expressions/java -visual-regex-tester /このリンクはあなたが提案しているものに対してエラーを投げます。 –

答えて

2

あなたが

^([^#]*#[^-_]*)[-_](.*)$(?<=(?<!\.ok)\.(?:docx?|odt)$) 

説明使用することができそうです:

  • ^ - 文字列の先頭(不要.matches()で使用ではなく、有害な)
  • ([^#]*#[^-_]*)を - グループ1:#[^#]*)以外の0以上の文字の後に#、その後01以外の0以上の文字試合0+文字列の最後まで(DOTALLモードが指定されていないので)改行以外の文字がしかし...
  • (?<=(?<!\.ok)\.(?:docx?|odt)$) - - 最後に到達した後、かどうかを確認
  • (.*)$[-_]付き)と_(?<=\.(?:docx?|odt)$)参照)の前には、.ok(?<!\.ok)参照)が付いていない.docまたは.docxまたは.odtがあります。 PCREでは、これらの条件を分割する必要があります。Javaの正規表現は、見た目の内側で交互に対処しているようです。

先読みベース代替:

^([^#]*#[^-_]*)[-_](?=.*(?<!\.ok)\.(?:docx?|odt)$)(.*)$ 

regex101 demoを参照してください。これは同じですが、文字列の最後のチェックはすべて-または_と一致した後に行われます。

Java demoを参照してください:

List<String> strs = Arrays.asList("CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.doc", 
      "CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.docx", 
      "CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.odt", 
      "CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.ok.docx", 
      "CRS-ISAU-RPV#3430_Dedalus_Conc.ok.erto_AOTreviglio.ok.odt" 
     ); 
for (String str : strs) { 
    System.out.println("----------\nMatching: " + str); 
    Matcher m = Pattern.compile("^([^#]*#[^-_]*)([-_])(.*)$(?<=(?<![.]ok)[.](?:docx?|odt)$)").matcher(str); 
    if (m.matches()) { 
     System.out.println(m.group(1)); 
     System.out.println(m.group(2)); 
     System.out.println(m.group(3)); 
    } else { System.out.println("No match"); } 
} 
+0

あなたの答えをよろしくお願いします。しかし、「私はちょうど3つの_(または_)の文字を組み合わせる必要があります。つまり、総称して3つの '_'または' 'があることを意味します。2つの文字を合計すると、3つの文字になります。これらの文字の間には、'# 'は含まれません。サンプルファイル名(String)は、 '_'が3つあることを示していますが、' _'を '-'で置き換えることはできますが、一致するはずです。 –

+0

[this](https://regex101.com/r/cC2wF4/1)ですか? (^ -^\ n)*)[ - _](?=(?:[^ -_ \ n] * [_-]){3} [^ -_テスト用)と '"(^([^#])$)(。\) *?(* =?*(?<!)*)[^ -_] *) [。] ok)[。](?:docx?| odt)$)(。*)$ "'(コード内での使用)。 –

+1

私はあなたの答えの助けを借りてそれを解決しました。私はあなたの答えを正しいものとしてマークします:)ありがとうございました! –

関連する問題