2

私は以下のように2つの文字列を持っています:

test1 = "<div>/*abc*/</div>";
test2 = "<div>/*abc*/Contents/*efg*/</div>";

すべてを削除する必要があり/*...*/ますdivdivのみが含まれている場合は削除します/*...*/。以下は私が行った正規表現です:

Regex rx1 = new Regex(@"<div>/\*[^>]+\*/(</div>|<br/></div>|<br></div>)");
TemplateEditorFormatted = rx1.Replace(TemplateEditorFormatted, match => { return String.Empty; });

stringtest1の場合、正しい結果が返され、すべてが削除されます。

ただし、 のtest2場合、すべてのコンテンツも削除されます。推定結果は何も削除しないでください。

UPDATED (学習用)

テスト2の場合、/ .. /を削除したいが、div全体は削除したくない場合。正規表現はどのように見えますか?

誰でも助けることができますか?ありがとう

4

2 に答える 2

1

なぜワンステップでそれを行うのですか?私見では、2つのステップではるかに読みやすくなっています:

string s1 = "<div>/*abc*/</div>";
string s2 = "<div>/*abc*/Contents/*efg*/</div>";

Regex findComments = new Regex(@"/\*.*?\*/");
Regex findEmptyDivs = new Regex(@"<div></div>");

s1 = findComments.Replace(s1, "");
s1 = findEmptyDivs.Replace(s1, "");

s2 = findComments.Replace(s2, "");
s2 = findEmptyDivs.Replace(s2, "");
于 2013-10-23T07:33:52.870 に答える
1

否定的な先読みアサーションを使用する方がよいでしょう:

@"<div>/\*(?:.(?!\*/))*\*/(</div>|<br/></div>|<br></div>)"
          ^^^^^^^^^^^^^

気になる部分は(?:.(?!\*/))*.

  1. (?:foo)単なる非キャプチャ グループです。今のところ、単に(foo).
  2. ワイルドカード.で、任意の 1 文字に一致します。
  3. これは、否定先読みアサーション(?!bar)として知られています— 一致しない場合に一致し、ゼロ幅の式です。つまり、一致中に文字を消費しません。bar

したがって、アイデアは、後に が続かない文字列と.一致*/その後*/</div>.

于 2013-10-23T07:22:55.033 に答える