2009-11-12 2 views
0

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

Моя проблема заключается в том, что мне обычно нужно искать начальную и конечную части пакета, чтобы различать их, данные между ними не имеют значения.

Каков наиболее эффективный способ игнорировать данные между началом и концом?

Вот простой пример. Пакет, который я ищу, начинается с $ CH; и заканчивается #

В настоящее время мой регулярное выражение \$CH;.*?#

Это. *? Я волнуюсь о. Есть ли лучший (или более эффективный) способ принять любой символ между заголовком пакета и конечным символом?

Кроме того, некоторые из пакетов имеют \ n символы в данных, поэтому используйте. не будет работать вообще, если это означает [^ \ n].

Я также рассмотрел [^\x00]*? для обнаружения любых символов, поскольку значение null никогда не используется в данных.

Любые предложения?

ответ

4

\$CH;.*?# прекрасно и должен быть весьма эффективным. Вы можете сделать более ясным то, что не должно быть обратного отсчета, написав его как \$CH;[^#]*#, если хотите.

Вы можете использовать (.|\n) или [\w\W], чтобы соответствовать настоящему любому символу - или даже лучше, используйте опцию RegexOptions.Singleline изменить поведение .:

Определяет режим однострочного. Изменяет значение точки (.), поэтому он соответствует каждому символу (вместо каждого символа, кроме \n).

+0

Мне нравится \ $ CH; [^ #] * # лучший до сих пор. Вопрос: если бы я использовал \ $ CH; [^ #] *? # Вместо этого, вопросительный знак был бы чисто избыточным? – CodeFusionMobile

+0

Да, это было бы излишним. –

1

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

\$CH;[\s\S]*?# 
0

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

+0

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

+0

@CSharperWithJava Хорошо, я этого не осознавал. В этом случае, если пакеты не могут быть пустыми, используйте '\ $ CH; [^ #] + #'. –

1

Чтобы обнаружить начало строки/данных используют ^ якорь, чтобы определить конец, использовать $ якорь:

^start.*?end$ 

Имейте в виду, что .*? может не соответствовать новой строки, один вариант, чтобы изменить его для [\s\S]*?

+0

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

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