2016-10-15 1 views
2

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

следующее выражение: ^(#+).+$ отлично работает на любом онлайн-инструмент тестирования регулярных выражений:

enter image description here

Но он отказывается работать с .net:

enter image description here

Это не кажется чтобы принять во внимание тег $, и просто выделяет все до конца строки, несмотря ни на что. Это мой C#

RegExpression = new Regex(@"^(#+).+$", RegexOptions.Multiline) 

Что мне не хватает?

+0

Точка не может соответствовать LF без модификатора DOTALL. Можете ли вы поделиться dotnetfidle? –

+0

У вас заканчивается CR. Используйте '@"^(# +). +? \ R? $ "' –

ответ

1

Понятно, что текст содержит строку, отличную от LF. В .NET regex точка соответствует любому символу, но LF. Таким образом, использование

@"^(#+).+?\r?$" 

.+?\r?$ будет соответствовать лениво любым один или несколько другим, чем LF символов до первого CR (что не является обязательным) непосредственно перед символом новой строки.

Или просто использовать отрицание класса символов:

@"^(#+)[^\r\n]+" 

[^\r\n]+ будет соответствовать один или несколько отличным CR/LF символов.

+0

Рад, что это сработало для вас. Если вы нашли мой ответ полезным, пожалуйста, также подумайте о его продолжении. –

0

У вас все хорошо. Единственное, чего вам не хватает, это то, что . не соответствует символам новой строки, даже с многострочной опцией. Вы можете обойти это двумя разными способами.

Самый простой способ - использовать флаг RegexOptions.Singleline, который заставляет символы новой строки рассматриваться как символы. Таким образом, ^ по-прежнему соответствует началу строки, $ соответствует концу строки и . соответствует всем включая новые строки.

Другой способ исправить это (хотя я бы не рекомендовал его для вашего случая использования) - изменить ваше регулярное выражение, чтобы явно разрешить новые строки. Для этого вы можете просто заменить любой . на (?:.|\n), что означает либо anycharacter, либо новую строку. Для вашего примера вы получите ^(#+)(?:.|\n)+$. Если вы хотите, чтобы вначале был несимметричный символ, добавьте дополнительную точку: ^(#+).(?:.|\n)+$

+0

Я думаю, вы неправильно поняли мой вопрос. Я не хочу соответствовать новым строкам. Второе изображение - это то, что у меня есть, и первое изображение - это то, что я ДОЛЖЕН получить. Входная строка «это \ n #header \ n, но это не так» должна соответствовать только «#header». В настоящее время он соответствует «#header, но это не так» – user2950509

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