Как найти это с помощью регулярных выражений? - PullRequest
1 голос
/ 23 марта 2009

Я думал, что понимаю регулярные выражения C #, но, очевидно, это не так. Мне нужна помощь в разработке выражения, которое бы находило все от START | BEGIN до)). Выражение может быть многострочным.

Ex.

START( FTP_STATE, XXX(
   VAL( FTP_INITIAL_STATE, 0 )
   VAL( FTP_INBOUND,       1 )
   AL( FTP_OUTBOUND,      2 )
))

/**************************************************************/

BEGIN( FTP_TIMER_MODE, YYY(
   VAL( FTP_REMOVE_TIMER,     0 )
   VAL( FTP_NOT_REMOVE_TIMER, 1 )
))

/**************************************************************/

Любая помощь с благодарностью

Ответы [ 9 ]

10 голосов
/ 23 марта 2009

Это прямо вперед; НАЧАТЬ или НАЧАТЬ, затем любое число любого символа, но не жадный и, наконец, две закрывающие скобки. . *? занимает любое количество любого символа, но как можно меньше. Чтобы сопоставить более одной строки, должна быть включена однострочная опция (? S) (спасибо Alan M. за указание на это.)

(?s)(START|BEGIN).*?\)\)
4 голосов
/ 23 марта 2009

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

(?:START|BEGIN)(?:[^)]+|\)[^)])+\)\)

Чтобы объяснить это:

  • (?:START|BEGIN) Начните с START или BEGIN.
  • (?:[^)]+|\)[^)])+ После этого любой символ, кроме ) ([^)]+) или ), за которым следует любой символ, отличный от ) (\)[^)]), может следовать. (Таким образом, нет способа сопоставить )) с этим выражением.)
  • \)\) Наконец )).

Надеюсь, это уменьшит возврат.

1 голос
/ 24 марта 2009

Вы уже получили свой ответ, но я подумал, что добавлю эту ссылку , которую я считаю очень полезной для построения / тестирования выражений. Вы можете быстро проверить все, а затем вставить выражение в свой код, когда оно вас устроит.

1 голос
/ 23 марта 2009
@"(?s)(?:START|BEGIN).*?\)\)"

То, что некоторые другие называют «многострочным режимом», на самом деле однострочный (или DOTALL) режим. Это режим, который позволяет точке соответствовать новым строкам. Многострочный режим позволяет '^' соответствовать началу строки, '$' соответствует концу строки (обычно, только совпадение с началом и концом всей строки. Я использую режим DOTALL с модификатором inline "(? )».

1 голос
/ 23 марта 2009

На самом деле вам также необходимо учитывать VAL (...).

В Perl это будет:

(BEGIN|START)\([^(\)\)\))].+\)\)\)
  1. Начинается с НАЧАЛА или НАЧАЛА
  2. Имеет открывающую скобку
  3. Позволяет ничего НЕ))) между, чтобы избежать жадного совпадения
  4. Заканчивается тремя закрывающими скобками)))
0 голосов
/ 23 марта 2009

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

MatchCollection m = Regex.Matches(input, "(START|BEGIN).+?\\)\\)", RegexOptions.Multiline);
0 голосов
/ 23 марта 2009
ResultString = Regex.Match(subject, @"(START|BEGIN).*?\)\)", RegexOptions.Singleline).Value;
0 голосов
/ 23 марта 2009

Если вы не понимаете и хотите учиться, regexps, то позвольте мне порекомендовать этот regexp site

Решение, вероятно, что-то вроде /(START|BEGIN).*))/

0 голосов
/ 23 марта 2009

Я не знаю синтаксис для C #, но в Perl это:

m/(BEGIN|START).*?\)\)/s

s делает его многострочным.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...