2011-11-08 9 views
0

SQLパッチファイルを含むフォルダを検索するコードがあります。正規表現は、私がnumber-text-text.sqlを一致させるために使用するどのようなファイル名を 'number-text-text'の形式と一致させるために使用するRegexは何ですか?

number-text-text.sql

:私は、彼らが次の名前の形式に一致する場合、配列にファイル名を追加したいですか?

ファイル名のnumber部分が2つの数字の間にある正規表現マッチファイル名にすることはできますか?もしそうなら正規表現の構文は何でしょうか?

+0

「テキスト」を定義します。文字、スペース、句読点、数字? –

+0

テキストには文字のみが含まれます – Theomax

+0

また、 'number'と' two numbersの間に 'を定義します。いくつかの例は、誤解を防ぐのに役立ちます。 –

答えて

1

次の正規表現は、中途半端そこにそれを作る:それは正規表現としてトリッキー取得する特定の範囲に一致するについて

\d+-[a-zA-Z]+-[a-zA-Z]+\.sql 

は範囲を処理するための簡単な方法がありません。 2と13の間の数とファイル名にマッチを制限するには、これは正規表現です:

([2-9]|1[0-3])-[a-zA-Z]+-[a-zA-Z]+\.sql 
+2

'\ w'は文字、アンダースコア、数字の両方と一致します。 –

+0

@ハルピオン私は彼がそれを更新したときにそれを修正しました。 – Marcus

1

これは動作するはずです:

select '4-dfsg-asdfg.sql' ~ E'^[0-9]+-[a-zA-Z]+-[a-zA-Z]+\\.sql$' 

これは単純なASCII文字にテキストを制限します。あなたが望むものかもしれません。 これはPostgreSQLでテストされています。正規表現のフレーバは実装間で多くの点が異なります。あなたはおそらくそれを知っている?

アンカーはbegin ^とend $です。これはどのように行うかによって異なります。

+0

おそらくタイプミスですが、文字クラスの2番目の 'a'は大文字にする必要があります。 – Marcus

+0

[0-9]は\ dと同じですが、どこにバックスラッシュをエスケープしたのか分かりませんが、ダッシュをバックスラッシュする必要はありません。また、[a-z]の代わりに[a-z]をiフラグと一緒に使用してみませんか? – Jesse

+0

@ Jesse:実装間で正規表現が異なります。 OPはどのような文脈で正規表現が必要であるかを明らかにしなかった。私はできるだけジェネリックとして公式化しようとしました。 '[0-9]'や '\ d'のように、両方とも数字文字クラスのためには単純です。 –

1

方法について:

\d+-[^-]+-[^-]+\.sql

編集:あなただけの手紙をしたいので、ここにはなくてです特定の範囲。

\d+-[a-z]+-[a-z]+\.sql - あなたはまた、それは、C#で行うのかどうかはわかり、iフラグを使用しないようにしたいでしょうが、ここでは、JS/perlである:

/\d+-[a-z]+-[a-z]+\.sql/i

範囲がより困難です。ここでは0〜255と一致する方法の例です:

([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])

ので-text-text.sql(0〜255)を一致させるために、あなたはこの必要があるだろう:

/^(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])-[a-z]+-[a-z]+\.sql/i

を(私は数字を非捕捉グループに入れ、数字の部分一致を防ぐために文字列の先頭から一致させ、番号付きのグループなどを期待している場合に備えて)。

基本的には、可能性の別の数字が必要になるたびに、このケース内に新しい条件を追加する必要があります。一致させる数字が小さいほど、必要なケースが増えます。あなたの最小/最大は何ですか? AFAIKでは、これを動的に行う簡単な方法はありません(ただし、私が誰かに私がそれについて間違っていることを示すのは大好きですが)。

これを回避する最も簡単な方法は、数字をキャプチャし、ネイティブ構文を使用して範囲内にあるかどうかを確認することです。 JSでの例:

var match = filename.match(/(\d+)-[a-z]+-[a-z]+\.sql/i); 
if(match && match[1] < maximumNumber && match[1] > minimumNumber){ 
    doStuff(); 
} 
+1

'[^ - ]'は単なる文字だけではありません。 – CanSpice

+0

うん、ポスターのコメントを見て、答えを更新しました。 – Jesse

1

あなたの正規表現は次のようになります。

(\d+)-[a-zA-Z]+-[a-zA-Z]+\.sql 

あなたは、あなたの数はあなたが望む二つの数字の間にあるかどうかを確認するために最初のキャプチャグループを使用します。数値が正規表現の範囲内にあるかどうかを確認しないでください。それを2つのステップで行います。あなたのコードははるかに明確になります。

関連する問題