C# - Regex - Соответствие именам файлов согласно определенному шаблону именования

Лучше всего использовать Integer.parseInt. Это вернет int , но это может быть автоматически упаковано в целое число. Это немного быстрее, чем valueOf, так как, когда ваши числа между -128 и 127, он будет использовать кэш Integer, а не создавать новые объекты. Самый медленный метод Apache.

private String data = "99";

public void testParseInt() throws Exception {
    long start = System.currentTimeMillis();
    long count = 0;
    for (int i = 0; i < 100000000; i++) {
        Integer o = Integer.parseInt(data);
        count += o.hashCode();
    }
    long diff = System.currentTimeMillis() - start;
    System.out.println("parseInt completed in " + diff + "ms");
    assert 9900000000L == count;
}

public void testValueOf() throws Exception {
    long start = System.currentTimeMillis();
    long count = 0;
    for (int i = 0; i < 100000000; i++) {
        Integer o = Integer.valueOf(data);
        count += o.hashCode();
    }
    long diff = System.currentTimeMillis() - start;
    System.out.println("valueOf completed in " + diff + "ms");
    assert 9900000000L == count;
}


public void testIntegerConverter() throws Exception {
    long start = System.currentTimeMillis();
    IntegerConverter c = new IntegerConverter();
    long count = 0;
    for (int i = 0; i < 100000000; i++) {
        Integer o = (Integer) c.convert(Integer.class, data);
        count += o.hashCode();
    }
    long diff = System.currentTimeMillis() - start;
    System.out.println("IntegerConverter completed in " + diff + "ms");
    assert 9900000000L == count;
}

parseInt completed in 5906ms
valueOf completed in 7047ms
IntegerConverter completed in 7906ms
12
задан Andrew 21 October 2009 в 14:35
поделиться

4 ответа

    string pattern = @"I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip";
    var matches = Directory.GetFiles(@"c:\temp")
        .Where(path => Regex.Match(path, pattern).Success);

    foreach (string file in matches)
        Console.WriteLine(file); // do something
17
ответ дан 2 December 2019 в 05:54
поделиться

Это зависит от того, насколько конкретно вы хотите сопоставить эти имена. Достаточно ли это конкретное:

I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip

?

Объяснение:

I             // match an 'I'
[A-Z]{3}      // followed by three upper case letters
_             // followed by an underscore
\d{5}         // followed by five digits
-             // followed by a hyphen
\d            // followed by a single digit
_             // followed by an underscore
\d{8}         // followed by eight digits
_             // followed by an underscore
\d{8}         // followed by eight digits
_             // followed by an underscore
\d{6}         // followed by six digits
\.zip         // followed by '.zip'

Но, если у вас есть файлы, имена которых содержат недопустимые даты или время, это практически невозможно сделать с одним регулярным выражением, особенно если ваш DATE_DATE часть указывает диапазон дат. Вам нужно будет сопоставить все имена файлов, которые я (и другие) показал вам, а затем выполнить некоторую «обычную» логику программирования, чтобы отфильтровать недопустимые.

7
ответ дан 2 December 2019 в 05:54
поделиться

Для простого регулярного выражения, которое также будет соответствовать недопустимым спецификациям времени (например, часы = 73 и т. Д.), Вы можете использовать что-то вроде этого:

^I[A-Z]{3}_\d{5}-\d_\d{8}_\d{8}_\d{6}\.zip$
2
ответ дан 2 December 2019 в 05:54
поделиться

RegexBuddy - отличный способ потратить несколько долларов (если у вас есть что потратить). Это поможет вам разрабатывать, тестировать и отлаживать регулярные выражения. Он даже создает для вас фрагменты кода.

RegexMagic (от того же автора) может даже помочь вам больше: он помогает вам создавать шаблон регулярного выражения из образцов. (Я не пробовал, поэтому не могу сказать, хорошо ли это).

0
ответ дан 2 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: