2016-03-18 1 views
0

Я пытаюсь создать регулярное выражение для соответствия внешним скобкам, но игнорируя скобки из строк комментариев внутри внешних скобок.Регулярное выражение для соответствия внешним скобкам, но игнорирование строк комментариев с помощью скобок

Пример строки:

(
this is an example; 
// this is a comment line with an '(' in it and should be ignored 
this is (another) line; 
) 

Мой текущий регулярное выражение:

\(((?>\((?<c>)|[^()]+|\)(?<-c>))*(?(c)(?!)))\) 

это то, что я получаю:

(' in it and should be ignored 
this is (another) line; 
) 

, но мне нужно это:

this is an example; 
// this is a commentline with an '(' in it and should be ignored 
this is (another) line; 
+1

Вы можете не проверить, если строка начинается с кронштейном? Он не мог сопоставить скобку строки, чтобы сказать комментарий таким образом. – Dispersia

+0

Зачем использовать регулярное выражение, когда открывающая и закрывающая скобка является единственным символом в новой строке? – Camo

+0

Это всего лишь пример. Скобки также могут быть в одной строке. – Sheik

ответ

1

Вот как это сделать.

  • Использование (?<=\()(.*?)(?=\))Demo, который использует look around утверждения.

  • \((.*?)\)Demo который использует захваченную группу. Захват \1.

Примечание: Используйте DOTOALL флаг s чтобы . соответствие новой строки.

Fixed your demo используя lazy количественный показатель ?.


Вышеупомянутое регулярное выражение будет работать во многих случаях. После того как множество других спецификаций OP здесь является окончательной демонстрацией.

Final Demo

+0

это не работает для меня. См. [Link] (https://regex101.com/r/uH2lZ1/1) Мне нужно совпадение для всех внешних скобок. Если вы знаете, что я имею в виду? – Sheik

+0

@Sheik: Позвольте мне проверить. Проверьте обновленный ответ. ваша демонстрация в моем ответе –

+0

Прошу прощения, я забыл добавить больше скобок. Иногда у меня больше внутренних скобок. [link] (https: // regex101 .com/r/uH2lZ1/3) Это стало причиной моих балансирующих групп. – Sheik

0

Попробуйте

\((([^)]+)|(\/\/[^\n]+\n))\) 
+1

Это улучшит ваш ответ, если вы объясните, как то, что вы предлагаете, решает проблему. – Nanhydrin

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