Рейтинг:
2
phil.o
Для этого можно использовать регулярное выражение.
Что-то вроде
using System.Text.RegularExpressions;
// ...
private static readonly Regex r = new Regex(@"_.*", RegexOptions.Compiled | RegexOptions.CultureInvariant);
// _.? means "underscore character, followed by zero or more character"
// ...
string filename = "B1_1-A.dwg";
filename = r.Replace(filename, "");
// Here, filename is "B1"
Примечание: если вы используете регулярное выражение повторно, вероятно, лучше всего сделать его статическим полем только для чтения в классе, который вы используете, потому что создание регулярного выражения повторно влияет на ожидаемую производительность; если вы сделаете его статическим, производительность будет намного выше.
Второй вариант, используя статические
Replace
метод:
using System.Text.regularExpressions;
// ...
string filename = "B1_1-A.dwg";
filename = Regex.Replace(filename, @"_.*", "");
// Here, filename is "B1"
[Edit] мой плохой, я неправильно понял вопрос. Кажется, мне не следует отвечать до второго кофе. Я изменил решение. [/Редактировать]
[Edit2] проверил его; не совпадает. Все еще ищу [/Edit2]
[Edit3] Сейчас работая. Странно, что он совпадает с
*
но не
?
. [/Edit3]
PIEBALDconsult
Нет такой вещи, как "строка кода".
Sarita Mall
Я думаю,что мой ответ был правильным, который я удалил.
Мой ответ, который я написал ранее :
имя файла.Split('_')[0];
phil.o
Да, это было; если вы не возражаете добавить его обратно, он будет зачислен.
PIEBALDconsult
Или используйте статический метод в классе регулярных выражений-он также обеспечивает повышение производительности.
phil.o
Ты что там шутишь статическая замена а его перегрузки? Мне всегда было интересно, строится ли соответствующее регулярное выражение при каждом вызове, поэтому я предпочитал определять статическую переменную. Хотя, должен признаться, я никогда не проводил никаких тестов.
Спасибо за яркое освещение.
PIEBALDconsult
Я работал над своей собственной схемой кэширования регулярных выражений, но обнаружил, что в некоторых случаях она работает не очень хорошо.
Только несколько недель назад я заметил это в документации:
"Этот шаблон регулярных выражений кэшируется для быстрого извлечения механизмом регулярных выражений."
Поэтому сейчас я предпочитаю статические методы, особенно когда параллелизм имеет первостепенное значение.
phil.o
Думаю, я тоже пересмотрю свою схему. Большое спасибо!
phil.o
Спасибо. Я думаю, что ваше решение проще, хотя (таким образом, лучше). Сначала я неправильно понял вопрос, и это имело смысл использовать регулярное выражение.
Maciej Los
Каждое решение хорошо ;) Я уже видел ваш ответ раньше, и мне было интересно, почему все содержимое было вычеркнуто. Похоже, ваш шаблон регулярных выражений был неправильным.
phil.o
Действительно, я ударил его, пока искал подходящее выражение.
Я не могу выяснить, почему _.*
спички, тогда как _.?
не.
Maciej Los
;) Объяснение вполне очевидно:
* Matches the previous element zero or more times.
? Matches the previous element zero or one time.
Видеть:
Документация MSDN
phil.o
* копание *
* копание *
* сокрытие *
какой позор! :)
Рейтинг:
13
Maciej Los
Цитата:
У меня есть имя файла, т. е., "B1_1-A.dwg
".
Я хочу, чтобы это выглядело как "B1
"
Не знаю, в чем проблема... Взгляните на пример:
string filename = "B1_1-A.dwg";
int pos = filename.IndexOf("_");
string newfilename = filename.Substring(0, pos);
Console.WriteLine(newfilename);//prints: B1
Приведенный выше код может быть упрощен до:
filename.Substring(0, filename.IndexOf("_"));
Если я неправильно понял ваши требования, пожалуйста, дайте мне знать.