2

BBcode コンバーターを html に書いています。
コンバーターは閉じられていないタグをスキップする必要があります。

私はそれを行うための2つのオプションについて考えました:
1)次のような1つの正規表現呼び出しを使用して、すべてのタグを一度に一致させます:

Regex re2 = new Regex(@"\[(\ /?(?:b|i|u|quote|strike))\]");
MatchCollection mc = re2.Matches(sourcestring);

次に、2 つのポインターを使用して MatchCollection をループし、開始タグと開始タグを見つけ、正しい html タグに置き換えます。

2) すべてのタグに対して正規表現を複数回呼び出し、直接置き換えます。

Regex re = new Regex(@"\[b\](.*?)\[\/b\]"); 
string s1 = re.Replace(sourcestring2,"<b>$1</b>");

より効率的なものは何ですか?

最初のオプションは 1 つの正規表現を使用しますが、すべてのタグをループしてすべてのペアを見つけ、ペアを持たないタグをスキップする必要があります。
もう1つの良い点は、タグ間のコンテンツを気にしないことです。位置を使用して作業して置き換えるだけです。

2 番目のオプションでは、ループや特別な置換関数の作成について心配する必要はありません。
ただし、複数の正規表現と置換を実行する必要があります。

何を提案できますか?

2 番目のオプションが正しい場合、正規表現に問題があります \[b\](.*?)\[\/b\]

次のような複数行にも一致するように修正するにはどうすればよいですか:

[b]
        test 1
[/b]

[b]
        test 2
[/b]
4

2 に答える 2

2

One option would be to use more SAX-like parsing, where instead of looking for a particular regex you look for [, then have your program handle that even in some manner, look for the ], handle that even, etc. Although more verbose than the regex it may be easier to understand, and wouldn't necessarily be slower.

于 2010-06-17T18:57:33.213 に答える
1
r = new System.Text.RegularExpressions.Regex(@"(?:\[b\])(?<name>(?>\[b\](?<DEPTH>)|\[/b\](?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:\[/b\])", System.Text.RegularExpressions.RegexOptions.Singleline);

 var s = r.Replace("asdfasdf[b]test[/b]asdfsadf", "<b>$1</b>");

これにより、終了タグが一致し、複数行も処理する要素のみが得られるはずです(SingleLineのオプションを指定しても、実際には単一行として扱います)

また、最初の [b] を無視して [b][b][/b] を適切に処理する必要があります。

この方法があなたの最初の方法よりも優れているかどうかについては、私には言えません. しかし、うまくいけば、これはあなたを正しい方向に向けるでしょう.

以下の例で動作するコード: System.Text.RegularExpressions.Regex r;

r = new System.Text.RegularExpressions.Regex(@"(?:\[b\])(?<name>(?>\[b\](?<DEPTH>)|\[/b\](?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:\[/b\])", System.Text.RegularExpressions.RegexOptions.Singleline);

var s = r.Replace("[b]bla bla[/b]bla bla[b] " + "\r\n" + "bla bla [/b]", "<b>$1</b>");
于 2010-06-17T18:54:22.253 に答える