2013-02-11 2 views
0

У меня есть текст, который будет содержать строки, окруженные #[ ]. Мне нужно сопоставить эти строки и узнать строку внутри.C# регулярное выражение для разделения, если совпадение содержит совпадение 2

Мой пример текста:

Lorem ipsum dolor #[This is my first string.] sit amet, consectetur elit, 
sed do eiusmod tempor incididunt #[This is my second string?] ut et dolore magna. 

С этим текстом я хотел бы иметь два матча:

#[This is my first string.] 
#[This is my second string?] 

Теперь я написал мое регулярное выражение:

\#\[([\w\s\W]*)\] 

Я добавил \W, потому что я хотел бы включить точки, вопросительные знаки и другие символы, которые а не письмо. Это вызывает у меня проблема, потому что теперь #, [ и ] включается, что приводит к моему тексту, чтобы иметь только один матч:

#[This is my first string.] sit amet, consectetur elit, 
sed do eiusmod tempor incididunt #[This is my second string?] 

Конечно, это соответствует на первое вхождение #[ и последнего вхождения ]. Как это решить? Я могу согласиться не включать #, [ и ] в мои строки, но если это возможно, следует добавить все другие символы без буквы.

ответ

2

Ваша проблема не в \W, это *. * жадный и будет соответствовать самой длинной струне. Таким образом, он соответствует первому [ с последним ] и занимает все промежуточные.

Попробуйте это:

\#\[([\w\s\W]*?)\] 

В самом деле, вы должны быть в состоянии упростить его просто:

\#\[(.*?)\] 

? после спецификатора (* или +) заставит минимальные матчи , То есть нежадным.

+0

Работает отлично. – John

0

Ваша проблема заключается в том, что \W также соответствует ]

Простой способ исправить это: после матча [ как многие не ] символы, как это возможно:

(#\[[^\]]*\]) 

Это должно сделать трюк красиво.

Смежные вопросы