2016-10-15 3 views
2

マークダウンコードを強調しようとしていますが、.NET regex multilineオプションのこの奇妙な動作に慣れています。それはいないようです

enter image description here

次の式:

enter image description here

しかし、それは.NETで動作することを拒否:任意のオンライン正規表現テストツールで正常に動作します^(#+).+$ $ tagを考慮に入れて、文字列の終わりまで何も強調しません。これは私のCです

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

私は何が欠けていますか?

+0

ドットは、DOTALL修飾子なしのLFと一致することはできません。 dotnetfidleを共有していただけますか? –

+0

CRが終了しています。 '@" ^(#+)。+?\ r?$ "' –

答えて

1

テキストにはLF以外の改行が含まれています。 .NET正規表現では、ドットはLF以外の任意の文字に一致します。だから、右改行前(すなわち任意である)第一CRまでレイジーLF以外の任意の一つ以上の文字にマッチする

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

.+?\r?$を使用します。

それとも否定文字クラスを使用します。

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

[^\r\n]+はCR/LF以外の1つの以上の文字にマッチします。

+0

あなたのために働いてうれしいです。私の答えが役に立つと分かったら、それをアップ・ボードすることを検討してください。 –

0

あなたが持っているものは良いです。欠けているのは、.が複数行オプションであっても、改行文字と一致しないことだけです。これを2つの異なる方法で回避することができます。

最も簡単なのは、改行を文字として扱うようにするRegexOptions.Singlelineフラグを使用することです。つまり、^は文字列の先頭に一致し、$は文字列の末尾と一致し、.はすべてと一致し、改行を含みます。

これを修正するもう1つの方法は、あなたの正規表現では改行を明示的に許可するように修正することです。これを行うには、.を任意の文字または改行を意味する(?:.|\n)に置き換えることができます。たとえば、^(#+)(?:.|\n)+$になります。最初に改行されていない文字があることを確認したい場合は、余分なドットを追加してください。^(#+).(?:.|\n)+$

+0

私はあなたが私の質問を誤解したと思います。私は新しい行と一致させたくありません。 2番目のイメージは私が持っているもので、最初のイメージは私が得なければならないものです。入力文字列「これは\ n #header \ nですが、これはありません」は「#header」にのみ一致する必要があります。現在、それは "#headerと一致していますが、これはありません" – user2950509

関連する問題