2016-10-21 3 views
1

Я пытаюсь соответствовать строке в C# с помощью Regex.IsMatch, который имеет следующий формат:C# регулярное выражение исключить определенный характер

([здесь ничего [здесь ничего] ничего здесь]) +

Пример: [mark[MARK]mark][[spacing]] будет действительной строкой, но [[[spacing]spacing] будет недействительным.

Обратите внимание, что

"что-нибудь здесь"

строка не может содержать

"[" или "]"

, и он также может быть пустой.

Я пытался что-то вроде @"(\[{1}\w*\[{1}\w*\]{1}\w*\]{1})+", но я не знаю, как сказать, двигатель Regex, что \w* не может содержать

"[" или "]"

.

Спасибо!

ответ

1

Вы должны использовать balancing groups, заключите все выражение в не-захвата группы, и количественно группу с + (один или более вхождений):

^(?:\[(?>[^][]+|(?<o>)\[|(?<-o>)])*(?(o)(?!))])+$ 

Посмотреть Подробности regex demo

:

  • ^ - начало строки
  • (?: - начало, не захвата + -quantified группы
    • \[ - это [
    • (?>[^][]+|(?<o>)\[|(?<-o>)])* - поиск любых 1+ кроме [ и ] или [ (добавляя его к группе символов "O" стек) или ] (удаление его группы «о» стек)
    • (?(o)(?!)) - если группа «о» не пусто, провалить матч, обратите внимание на следующую пару [...]
    • ]
  • )+ - один или несколько вхождений внутренней структуры
  • $ - конец строки.
+0

FYI, в демо, я добавил '\ r?' В конце и '\ n' в класс' [^] [] ', поскольку демонстрационный ввод представляет собой многострочную строку. Вы не нуждаетесь в них в фактическом шаблоне. –

1

Используйте это регулярное выражение

^(\[[^\[\]]*\[[^\[\]]*\][^\[\]]*\])+$ 

Regex объяснения:

  • ^ Матч начинается строки
  • ( Создать группу
  • \[ Match начиная [
  • [^\[\]]* Соответствует нулю или более строка, не[ и не]
  • \[ Match [ снова
  • [^\[\]]* Соответствует нулю или более строка, не[ и не]
  • \] Соответствие закрытию ]
  • [^\[\]]* Соответствует нуль или более строки, не[ и не] (снова)
  • \] Match последней ]
  • ) Ending группе
  • + квантор к спичкам предыдущей группы один или несколько встречаемости
  • $ Соответствующие концы струны