1

次のようなファイル名があります。

A123456_B123456_v1.10_File Name.xml

ファイル名が一致するかどうかを検証する正規表現パターンを作成しようとしました。

パターンは次のとおりです。

Regex regex = new Regex("A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(\\*?).xml");

機能していません。

これを直してくれませんか?

実施例

string fileName = "A545656_B958432_v12.8_Upload 1.xml";

Regex.IsMatch("A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(.*?)\\.xml", fileName)
4

2 に答える 2

1

私はこの正規表現がうまくいくはずだと信じています:

"A\\d{6}_B\\d{6}_v\\d{1,3}\\.\\d{1,2}_.*?\\.xml"

丸括弧は必要ありません (ただし、そのままにしておくことができます)。この部分はorに一致しますが、 には一致しない(\\*?)ため、間違っています。任意の文字だけでなくリテラルにも一致させたいため、代わりに , にする必要があります。A123456_B123456_v1.10_*A123456_B123456_v1.10_A123456_B123456_v1.10_File Name.xml\\.xml.

丸括弧付きバージョン

"A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(.*?)\\.xml"

それらの中で一致したものを取得したい場合にのみ必要です。

編集:

正規表現が機能しない理由は、Regex.IsMatch間違って使用しているためです。MSDNによると、それは Regex.IsMatch(input, pattern) です

Regex.IsMatch("A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(.*?)\\.xml", fileName) // instead of this
Regex.IsMatch(fileName, "A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(.*?)\\.xml") // do this instead

そして、あなたがやっているので

Regex regex = new Regex("A(\\d{6})_B(\\d{6})_v(\\d{1,3}\\.\\d{1,2})_(.*?)\\.xml");

なぜ使わないのですか?

if (regex.IsMatch(fileName))
    // do stuff

編集2:

二重エスケープを使用する代わりに、逐語的な文字を使用して正規表現を読みやすくすることができます@

Regex regex = new Regex(@"A(\d{6})_B(\d{6})_v(\d{1,3}\.\d{1,2})_(.*?)\.xml");
于 2013-03-01T12:18:15.203 に答える
0

これよりもクリーンな方法がありますが、うまくいきます。

private void textBox1_TextChanged(object sender, EventArgs e)
        {

        string Reg = "^[A]{1}[0-9]{6}[_]{1}[B]{1}[0-9]{6}[_]{1}[v]{1}[1]{1}[.]{1}[1]{1}[0]{1}[_]*";

        if (Regex.IsMatch(textBox1.Text, Reg))
        {
            textBox1.BackColor = Color.Green;
            textBox1.ForeColor = Color.White;
        }
        else
        {
            textBox1.BackColor = Color.White;
            textBox1.ForeColor = Color.Black;
        }
    }
于 2013-03-01T12:24:29.863 に答える