2009-03-23 4 views
1

Я думал, что понял регулярные выражения 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) 
)) 

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

Любая помощь очень ценится

+0

Я бы рекомендовал использовать RegexBuddy для работы с регулярными выражениями. Он сохранял мою задницу много раз;) – Alekc

ответ

4

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

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

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

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

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

10

Это прямо вперед; START или BEGIN, затем любое количество символов, но не жадных и заканчивающихся двумя закрывающимися круглыми скобками. . *? принимает любое число любого символа, но как можно меньше. Для того, чтобы соответствовать над более чем одной строкой опция однолинейной (?) Должно быть включено (Спасибо Аланы М. за указание на это.)

(?s)(START|BEGIN).*?\)\) 
+0

Хорошее объяснение –

0

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

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

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

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

+0

Это совпадает до последнего)) в файле, а не в первом)) после BEGIN или START – Tmdean

0

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

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

1

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

В Perl'х было бы:

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

Нет, если окончание «))« всегда находится на линия сама по себе. Во всяком случае, ваше регулярное выражение не работает. Похоже, вы пытаетесь использовать класс символов, как если бы это был негативный взгляд. –

+0

Хороший вызов - хотя это регулярное выражение будет соответствовать заданному тексту - по крайней мере, в быстрых php-тестах с использованием preg_, класс символов ничего не делает. –

0
ResultString = Regex.Match(subject, @"(START|BEGIN).*?\)\)", RegexOptions.Singleline).Value; 
+0

Я думаю, что это должен быть MultiLine? –

+0

Ммм, вероятно, вы правы, автогенерированный код из RegexBuddy, так как я работаю с php, а не C# (regex прав, хотя: D) – Alekc

0

Попробуйте

MatchCollection m = Regex.Matches(input, "(START|BEGIN).+?\\)\\)", RegexOptions.Multiline); 
1
@"(?s)(?:START|BEGIN).*?\)\)" 

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

+0

Спасибо, что указали, что многострочная/одинарная вещь. Имена параметров хорошо выбраны; вы можете включить однолинейный и многострочный режим в одно и то же время ...: D –

1

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

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