Регулярное выражение — захваченная группа с 1-5 порядками

#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