#c# #regex
#c# #регулярное выражение
Вопрос:
Привет, пытаюсь решить проблему с регулярными выражениями
У меня есть анализатор формул, который должен получать строки в некоторых тегах, входная строка будет выглядеть так:
[//part1/part2/abc] [/def] [ghi]
Все, что я хочу вернуть, это три группы, подобные этой:
abc
def
ghi
У меня есть частично работающее регулярное выражение, которое дает мне три группы и строки между квадратными скобками, но я просто не могу избавиться от пути с префиксом.
Если есть путь, он всегда будет использовать косые черты.
[(.*?)]
Кто-нибудь может помочь?
Комментарии:
1. Будет
[.*?/?([^/]] )]
ли этого достаточно? Вот оно в действии
Ответ №1:
Попробуйте ниже regex захватить один или несколько символов слова перед ]
скобкой,
(w )]
Комментарии:
1. @raydeni В ответе Авинаша нет ничего плохого, если вы знаете, что покупаете: например, это не будет работать с
[/a-1]
or[/aamp;1]
, но в этомno_opening_bracket]
не будет ничего плохого, если с вашим вводом все в порядке, просто имейте это в виду. 🙂2. Да, теги ограничены [A-Za-z0-9], так что все должно работать нормально. Я должен был это заявить.
Ответ №2:
Вы можете попробовать это:
@"[(?:[^]/]*/)*([^]/] )]"
Где необязательная группа без захвата будет соответствовать всему, что заканчивается косой чертой.
Комментарии:
1. Почти идентично моему, но с группой захвата вместо lookbehind… 1 🙂
Ответ №3:
Прямое совпадение (без захвата)
Это регулярное выражение немного сложнее, потому что вместо того, чтобы записывать то, что вы хотите сгруппировать 1, мы сопоставляем его напрямую.
Регулярное выражение также подтверждает, что мы находимся внутри [brackets]
:
(?x) # free-spacing mode
(?<= # look behind: we should see
[ # an opening bracket, then
(?:(?:[^/]]*/ ) )? # optionally, one or more series of
# non-slashes, non-closing brackets followed by slashes
) # end lookbehind
[^/]]* # this is what we want to match: any character that is not a / or a ]
(?=[^/]*]) # lookahead: we should see no slashes, then a closing ]
Смотрите демонстрацию.
На самом деле вы можете использовать его в этом режиме свободного пробела, что упрощает его обслуживание и понимание позже. Объяснение в комментариях.
В коде C #:
Вот один из способов использовать это регулярное выражение в C#:
Regex yourRegex = new Regex(@"(?x) #free-spacing mode
(?<= # look behind: we should see
[ # an opening bracket, then
(?:(?:[^/]]*/ ) )? # optionally, one or more series of
# non-slashes, non-closing brackets followed by slashes
) # end lookbehind
[^/]]* # this is what we want to match: any character that is not a / or a ]
(?=[^/]*]) # lookahead: we should see no slashes, then a closing ]
");
allMatchResults = yourRegex.Matches(yourstring);
if (allMatchResults.Count > 0) {
// Access individual matches using allMatchResults.Item[]
}
Комментарии:
1. У меня болит голова, когда я смотрю на это, но работает хорошо. В чем недостаток использования групп захвата?