テキストについていくつかの単純化した仮定を立てることから始めます。これは、HTML を正規表現と一致させようとするときは常に必要ですが、この場合は主に正規表現を読みやすくするためです。正規表現は、基本構造を変更することなく、より複雑な基準を反映するように修正できます。
- 要素と属性の名前は常にアルファベットです (つまり、VS の
:w
、またはと一致し[A-Za-z]+
ます)。
- 属性名の前には常にスペースやタブ (
:b+
) が付きます。
- 属性値は常に引用符 (
:q
) で囲みます。
=
属性名とその値の間にスペースはありません。
また、 で否定先読みを使用する方法にも注目して~(style):w
ください。「1 つまたは複数の文字 ( :w
) ですが、単語を構成している場合はそうではありませんstyle
」と表示されます。" が前に付いていない限り、否定的な後読み: "であるかのように使用しています。多くの人がその間違いを犯します。<__@BGCOLOR{.@}>
style=
私は 4 段階のプロセスを提案します。
まず、特別なトークンを含む任意の要素を照合し、トークンがすべての属性の後にリストされるように並べ替えます。
- 探す:
{\<:w(:b+:w=:q)*}{:b+\<__\@BGCOLOR[^<>]*\>}{(:b+:w=:q)+}
- 交換:
\1\3\2
次に、属性がある場合は、それstyle
がリストされている最後の属性であることを確認します (ただし、特別なトークンの前):
- 探す:
{\<:w(:b+~(style):w=:q)*}{:b+style=:q}{(:b+~(style):w=:q)+}{:b+\<__\@BGCOLOR[^<>]*\>}
- 交換:
\1\3\2\4
3 番目に、特別なトークンをstyle
属性でラップします。
- 探す:
{\<__\@BGCOLOR[^<>]*\>}\>
- 交換:
style="\1">
最後に、2 つのstyle
属性がある場合は、それらをマージします。
- 探す:
style="{[^"]+}":b+style="{\<[^<>]+\>}"
- 交換:
style="\1; \2"
このテキストから始めます:
<div <__@BGCOLOR> id="inner-box" style="border:1px">
<div foo="bar" id="inner-box" <__@BGCOLOR TOGGLE="1"> style="border:1px">
<div id="inner-box" bar="foo" <__@BGCOLOR>>
<div id="inner-box" <__@BGCOLOR> style="border:1px">
<div id="inner-box" style="border:1px" <__@BGCOLOR TOGGLE="1">>
<div id="inner-box" <__@BGCOLOR> foo="bar">
...私はこれで終わります:
<div id="inner-box" style="border:1px; <__@BGCOLOR>">
<div foo="bar" id="inner-box" style="border:1px; <__@BGCOLOR TOGGLE="1">">
<div id="inner-box" bar="foo" style="<__@BGCOLOR>">
<div id="inner-box" style="border:1px; <__@BGCOLOR>">
<div id="inner-box" style="border:1px; <__@BGCOLOR TOGGLE="1">">
<div id="inner-box" foo="bar" style="<__@BGCOLOR>">
Visual Studio は、ここでは大きなハンディキャップです。これは優れた IDE ですが、その正規表現のフレーバーは奇妙です。このようなことをたくさん行う場合は、EditPad ProやPowerGrepなど、標準構文でフル機能の正規表現を使用するツールに切り替えることを強くお勧めします。
編集:私は最終的に (比較的) 賢明なことを行い、主に問題が正規表現で解決できるかどうかを調べるために、Perl のようなフレーバーで正規表現を作成しました。それは、たった 2 つのステップで済みました。
探す:
(
<\w+\b
(?:
\s*
(?:
\w+="[^"]+"
|
<(?!__@BGCOLOR)[^<>]*>
)
)*
\s*
)
(<__@BGCOLOR[^<>]*>)
(
(?:
\s*
(?:
\w+="[^"]+"
|
<[^<>]+>
)
)*
)
交換:
$1style="$2"$3
探す:
(
<\w+\b
(?:
\s*
(?:
(?!style)\w+="[^"]+"
|
<[^<>]+>
)
)*
\s*
)
style="([^"]+)"
(
(?:
\s*
(?:
(?!style)\w+="[^"]+"
|
<[^<>]+>
)
)*
)
\s*style="([^"]+)"
交換:
$1style="$2; $4"$3
次のステップは、それを Visual Studio の構文に変換することです (それが可能であれば) が、私は疲れすぎて今すぐ始めることはできません。;) そして、私が前に言ったように、あなたがこの種のことをたくさんやろうとしているなら、専用のパーサーを書くか、標準構文を使用するツールまたは言語に切り替えることを検討すべきです (非常に大まかな定義のために) "標準")。何をするにしても、Visual Studio のネイティブのいわゆる正規表現の使用をやめれば、すべての人に有利になります。:D