1

私のアプリケーションの機能は、部分的な名前でフォルダー パスをチェックすることで構成されます (フォルダー名は次のようにフォーマットされます:「ID 名」、「ID」は任意の数字にすることができ、「名前」には任意の有効なフォルダー命名文字を含めることができます。

これらのフォルダーの「ID」ではなく、「名前」の部分しか知りません。これを使用して、これらのフォルダーを「名前」(「ID」なし) で取得します。

Dim regDirs = New Func(Of String, Boolean)(Function(i) Regex.IsMatch(i, "[\d]+[\s]" & strName, RegexOptions.Compiled Or RegexOptions.IgnoreCase))

'strName' は、ID を含まない名前を含む変数です。これは、任意の桁数 (ID として) とスペース文字、および名前に一致します。次に、この行を次の場所に渡します。

Directory.EnumerateDirectories(dirRoot).Where(regDirs)

そして、すべてが素晴らしく機能しますが、名前に正規表現メタ文字が含まれていない場合のみです。

これは私が立ち往生しているところです。すべてのメタ文字 ([\^$.|?*+(){}) をエスケープする上記の式の前に別の正規表現でチェックできる変数に名前を格納しようとしたため、上記の式は考慮されませんそれらを特殊文字として使用しますが、これを正しく行う方法や、より簡単な方法があるかどうかは完全にはわかりません。

次のような通常の文字列置換を使用して、各文字を個別に実行できることはわかっています。

Dim tempName as String = strName
tempName = tempName.Replace("[", "\[")

しかし、同じことを複数の行で行うと、あまりエレガントに見えず、非常に効率的かどうかもわかりません。

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

4

1 に答える 1

0

.NET は、Regex.Escapeまさにこの目的のためのメソッドを提供します。

Dim regDirs = New Func(Of String, Boolean)(Function(i) Regex.IsMatch(i, "[\d]+[\s]" & Regex.Escape(strName), RegexOptions.Compiled Or RegexOptions.IgnoreCase))
于 2013-08-24T16:44:47.340 に答える