#c# #.net #regex #string #.net-core
#c# #.net #регулярное выражение #строка #.net-core
Вопрос:
Я пытаюсь найти способ использовать регулярные выражения для извлечения строки в два значения. Примером строки является «Региональное хранилище 1 — Madison [RSM1]» «Региональное хранилище 2 [SS2]»
и я хотел бы, чтобы они были извлечены в «Региональное хранилище 1 — Madison», «RSM1» и «Региональное хранилище 2», «SS2».
Я пробовал использовать регулярное выражение (?<=[)(.*?)(?=]) но это дает мне «Региональный магазин 2 [«, «SS2», «]». Другие регулярные выражения, которые я пробовал, дают мне «Региональное хранилище 2», «[SS2]».
Поскольку строки всегда будут соответствовать формату «{Name} [{code}]» Мне интересно, должен ли я просто использовать string.split вместо этого.
Комментарии:
1.
s.TrimEnd(']').Split(" ["))
?2. Итак
"Regional Store 1 - Madison [RSM1]" "Regional Store 2 [SS2]"
, одна целая строка или вы имели в виду записать ее как 2 отдельные строки? Являются ли двойные кавычки частью строки?3. Я думаю
string[] parts = myFullString.Split(new char[] { '[',']'},StringSplitOptions.RemoveEmptyEntries)
, что следует выполнить трюк без использования TrimEnd, если часть {Name} не может содержать ни «[«, ни «]». Если он также может содержать эти символы, я бы выбралint indx = myFullString.LastIndexOf('['); string Name = myFullString.Substring(0, indx); string Code = myFullString.Substring(indx 1, myFullString.Length - indx - 2);
4. Если каждый раз есть только одна строка указанного формата, вы можете использовать это: var matches = Regex . Совпадения («Региональное хранилище 1 — Madison [RSM1]», «([^[]] ) w»). toArray(); var result = $»{соответствует [0].Значение}={соответствует [1].Значение}»;
Ответ №1:
Вы можете решить проблему без регулярных выражений, обрезав конечную ]
строку и разделив ее с "["
помощью или " ["
:
var s = "Regional Store 1 - Madison [RSM1]";
var chunks = s.TrimEnd(']').Split(" [");
Console.WriteLine("Name={0}, Code={1}", chunks[0], chunks[1]);
// => Name=Regional Store 1 - Madison, Code=RSM1
Или с регулярным выражением:
var pattern = @"^(.*?)s*[([^][]*)]$";
chunks = Regex.Match(s, pattern)?.Groups.Cast<Group>().Skip(1).Select(x => x.Value).ToArray();
Console.WriteLine("Name={0}, Code={1}", chunks[0], chunks[1]);
// => Name=Regional Store 1 - Madison, Code=RSM1
Смотрите демонстрацию C # и демонстрацию регулярных выражений.
Детали шаблона
^
— начало строки(.*?)
— Группа 1: любые нулевые или более символов, кроме символа новой строки, как можно меньшеs*
— ноль или более символов пробела[
—[
символ([^][]*)
— Группа 2: любые нулевые или более символов, кроме[
и]
]$
—]
символ и конец строки.
Комментарии:
1. Спасибо! Есть ли предпочтение между использованием регулярных выражений и разделением строк?
2. @redcabbage Это всегда так: предпочитайте регулярное выражение, если ваш формат строки известен, но он может каждый раз отличаться, например, между некоторыми частями может быть разное количество пробелов, или если числа разные, или могут быть некоторые избыточные повторяющиеся части и т.д. Используйте regular
String.Split
withString.TrimEnd
, если формат фиксирован, а строки всегда такие, «аккуратные».
Ответ №2:
пожалуйста, попробуйте этот шаблон
MatchCollection mcCollection = Regex.Matches(sIdentifire, @"(Regionals Stores . ?[. ?])");