Manav Singh Chauhan Ответов: 3

Удалить строку после определенного символа('_')?


У меня есть имя файла, то есть "B1_1-A. dwg".
Я хочу, чтобы это выглядело как "B1" в отчете, который я создаю.
У меня в Редакторе отчетов есть возможность написать код на c#.
Bt условие состоит в том, что код должен быть написан в одной строке.
Пожалуйста, предоставьте какое-нибудь решение.

Что я уже пробовал:

Я попробовал подстроку и разделение, но я не очень хорошо разбираюсь в c#, поэтому я не уверен, написал ли я правильный код или нет.

PIEBALDconsult

Ну, покажи нам код. Это работает?

phil.o

Пожалуйста, смотрите мой обновленный ответ, который теперь правильно соответствует подстроке.

BillWoodruff

"Я не очень хорошо разбираюсь в c#", поэтому начните учиться и экспериментировать, а не действовать беспомощно.

3 Ответов

Рейтинг:
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

Думаю, я тоже пересмотрю свою схему. Большое спасибо!

Maciej Los

5!

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

* копание *
* копание *
* сокрытие *
какой позор! :)

Maciej Los

;)

Рейтинг:
2

Sarita Mall

Привет ,

Это решение, которое я удалил ранее.

имя файла.Split('_')[0];

пожалуйста, дайте мне знать, если он не выполнит это требование.

С уважением,
Сарита


Рейтинг:
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("_"));


Если я неправильно понял ваши требования, пожалуйста, дайте мне знать.


phil.o

5 б.

Maciej Los

Спасибо, Фил.