#c# #regex
#c# #регулярное выражение
Вопрос:
У меня есть предложение типа «Это [[захваченная группа]]». Количество слов между захваченными может быть от 1 до 5.
Я хочу выделить все, что находится между двумя скобками (включая скобки). Я знаю, что мог бы использовать что-то вроде @"^.*(?<identifier>[[.*]]).*$"
но я хочу попытаться быть более точным, поэтому я подумал, что это сработает: @"^.*(?<identifier>[[w*(bw*){0,4}]]).*$"
Кто-нибудь может понять, почему это не работает? Фиксируется, есть ли одно слово, как между скобками, но не несколько. Я думал, что (bw*){0,4}
позволит добавить еще от 0 до 4 слов.
Спасибо, Билл Н
Ответ №1:
Я думаю, вы забыли о разделителях слов ( s
):
^.*(?<identifier>[[w (s bw ){0,4}]]).*$
Комментарии:
1. Почему не просто
(w (?:s |(?=]))){1,5}
, и зачем вам это нужноb
?
Ответ №2:
Ваша проблема здесь:
(bw*){0,4}
Это не сработало бы, поскольку вы не разрешили использовать пробелы. Измените его на:
(s bw*){0,4}
Это приведет к захвату пробелов, но вы можете легко выполнить постобработку (используя Trim()
).
Комментарии:
1.
s*
ничего не значит. Оно всегда будет захватываться (т. Е. Это на самом делеs
), поскольку всегда будет разделитель пробела — в соответствии с вопросом .
Ответ №3:
Вы создаете более одной записанной группы, по одной на скобку. Попробуйте это:
@"^.*(?<identifier>[[w*(?:sw*){0,4}]]).*$"
(?:)
Это группа без захвата, которая не создает переменную, так что ваш результат все еще находится в именованной группе.
Обновление: И, конечно, как указывалось в двух других ответах, ваша основная проблема заключается в отсутствии s
Я добавил это также в свое решение.
Update2: b
Не требуется при s
добавлении, поэтому удаляется.
Комментарии:
1. Вы добавили
s
между двумя необязательными символами word. И зачем вам это нужноb
?
Ответ №4:
Я бы предпочел что-то вроде этого (непроверенное):
^[^[]*(?<identifier>[[s*(w (?:s |(?=]))){1,5}]])[Ss]*$
^ # begin of string
[^[]* # some optional not '[' chars
(?<identifier> # <ID> begin
[[ # '[['
s* # some optional whitespace
(?:w (?:s |(?=])) ){1,5} # 1-5 words separated by spaces
]] # ']]'
) # end <ID>
[Ss]* # some optional any chars
$
# end of string