3

次のコンマ区切りリストでファイル名を検索しようとしています。

text.txt,temp_doc.doc,template.tmpl,empty.zip

Java の正規表現の実装を使用します。出力の要件は次のとおりです。

  1. ファイル名のみを表示し、それぞれの拡張子は表示しません
  2. 「temp_」で始まるファイルを除外する

次のようになります。

文章

テンプレート

空の

これまでのところ、最初のタスクに対処するために多かれ少なかれ満足のいく正規表現を書くことができました。

[^\\.,]++(?=\\.[^,]*+,?+)

2 番目の要件に準拠させるための最良のオプションは、ルックアラウンド構造を使用することですが、信頼できる最適化された式を記述する方法がわかりません。次の正規表現は必要なことを行っているように見えますが、明示的な最大ファイル名長に依存する以外の理由がなければ、明らかに欠陥のあるソリューションです。

(?!temp_|emp_|mp_|p_|_)(?<!temp_\\w{0,50})[^\\.,]++(?=\\.[^,]*+,?+)

PS私は正規表現を数日間しか勉強していないので、この初心者スタイルの過度に複雑なコードを笑わないでください:)

4

3 に答える 3

4
  • ファイル名のみを表示し、それぞれの拡張子は表示しません
  • 「temp_」で始まるファイルを除外する

1 つのバリアントは次のようになります。

(?:^|,)(?!temp_)((?:(?!\.[^.]*(?:,|$)).)+)

これにより、

  • 「単語文字」で始まらないファイル名 (Tim Pietzcker のソリューションはそうではありません)
  • ドットを含むファイル名 (sth. likefile.name.extは as と一致しますfile.name)

しかし、実際には、これは非常に複雑です。コンマで入力を分割し、部分から拡張子を削除する小さな関数を作成する方がよいでしょう。

とにかく、ここに分解があります:

(?:^|,) # ファイル名の開始: 文字列またはコンマの開始
(?!temp_) # 否定先読み: "temp_" で始まるファイル名を許可しない
( # 一致グループ 1 (ファイル名が含まれます)
  (?: # 非キャプチャ グループ (許可された 1 文字に一致)
    (?! # 否定先読み (後に続かない):
      \. # 点
      [^.]* # 任意の数の非ドット (これは拡張子に一致します)
      (?:,|$) # filename-end (文字列またはカンマの終わり)
    ) # 否定先読みを終了
    . # この文字は有効です、一致させます
  )+ # 非キャプチャ グループの終了、繰り返し
) # グループ 1 を終了

http://rubular.com/r/4jeHhsDuJG

于 2012-08-05T14:49:53.697 に答える
3

別のオプション:

(?:temp_[^,.]*|([^,.]*))\.[^,]*

そのパターンはすべてのファイル名に一致しますが、有効な名前のみをキャプチャします。

  • 現在の位置でパターンが一致する可能性がある場合、パターンは一致temp_file.extし、キャプチャされません。
  • 一致することができず、一致temp_するのに疲れ([^,.]*)\.[^,]*、ファイルの名前をキャプチャします。

ここで例を見ることができます:http ://www.rubular.com/r/QywiDgFxww

于 2012-08-05T14:52:26.737 に答える
3

これはどう:

Pattern regex = Pattern.compile(
    "\\b        # Start at word boundary\n" +
    "(?!temp_)  # Exclude words starting with temp_\n" +
    "[^,]+      # Match one or more characters except comma\n" +
    "(?=\\.)    # until the last available dot", 
    Pattern.COMMENTS);

これにより、ファイル名内のドットも許可されます。

于 2012-08-05T14:47:19.603 に答える