4

Powershell で Rexex を使用する際に少し問題が発生しました。実装エラーか何かがあるようです。

作業したいテキストは、次のような html ファイルです (例 1):

<span>[Mobile: %mobile% |] Phone: %telephone% [| Fax: %faxNumber%]</span>
<Span>

問題は、html エディターが原因で、次のような結果が得られることです (例 2):

<span>[Mobile: 

%mobile% |] Phone: %telephone% [| Fax: &nbsp;&nbsp;%faxNumber%]</span>

ご覧のとおり、改行と html エスケープ、固定された空白があります&nbsp;

私の Powershell 正規表現は次のようになります。

$x = $x -ireplace '(?ms)\[(.?){7}Fax(.*?)\]', 'MyReplacement1'

この

$x = $x -ireplace '(?ms)\[(.?){7}Mobile(.*?)\]', 'MyReplacement2'

基本的に[は変数の始まりを示し、]は変数の終わりを示します。これにより、次の 2 つの問題が発生します。

  1. モバイルとファックスの 2 つの変数を取得したので、(.?){7}いくつかの (ここでは正確に 7) 文字を許可し、最初の [モバイルの近くと最後の]ファックスの近くの穴の部分を一致させないように使用しています (これは、私が使用している場合に発生します)。(.*?)の代わりに(.?){7})。たとえば、開始 [ と変数キーワード「Fax」の間に任意の数 (7 ではなく) の文字を許可できる代替手段があるかどうかはわかりません。これは、次のようなものが追加されたときにミスマッチを回避するのに役立ち&nbsp;&nbsp;ます(7文字だけでは不十分で、私が言った(.*?)ように失敗します)。私はそれを説明できたことを願っています (ちょっと難しい) - そうでない場合: お気軽にお尋ねください!
  2. Powershells -replace メソッドは正規表現オプションを設定する方法を提供していないため、(?ms) を使用して DotAll および複数行モードを設定する必要がありました。ご覧のとおり、正規表現パターン内で使用しています。ただし、 example2のようにMobile:%mobile%の間に改行が追加されると、正規表現は失敗し、何も置き換えられません!

私が今考えていないさらなる問題を回避するために、プロからの助けや正規表現の推奨事項さえあれば、私は大歓迎です...

編集: (例 3):

<span>[Mobile: 

%mobile% |] Phone: %telephone% [| Fax: 
%faxNumber%]</span>
4

1 に答える 1

10

DotAll モードのトリックは、[\s\S]代わりに を使用することです.。この文字クラスは、任意の文字に一致します (スペースおよび非スペース文字に一致するため)。( [\w\W]or[\d\D]と同様ですが、スペースは一種の慣例のようです。)

を回避するには、実際に一致させたいものの前で7閉じることを単に禁止することができます(ちなみに、DotAll も不要になります)。]したがって、次のようなものがうまく機能するはずです。

\[([^\]:]*)Fax([^\]]*)\]

少し醜いように見えますが、これは単に次のことを意味します。

\[        # literal [
(         # capturing group 1
  [^\]:]* # match as many non-:, non-] characters as possible
)         # end of group 1
Fax       # literal Fax
(         # capturing group 2
  [^\]]*  # match as many non-] characters as possible
)         # end of group 2
\]        # literal ]

文字クラスに関する詳細情報。

これらのパターンのいずれも複数行モードを必要としないことに注意してください(mあなたのものでも私のものでもありません) 。しかし、これらのメタ文字を含むパターンはありません。したがって、修飾子は何もしません。^$

私のコンソール出力:

PS> $x = "<span>[Mobile: %mobile% |] Phone: %telephone% [| Fax: &nbsp;&nbsp;%faxNumber%]</span>"
PS> $x -ireplace '\[([^\]:]*)Mobile([^\]]*)\]', 'MyReplacement1'
<span>MyReplacement1 Phone: %telephone% [| Fax: &nbsp;&nbsp;%faxNumber%]</span>
PS> $x -ireplace '\[([^\]:]*)Fax([^\]]*)\]', 'MyReplacement2'
<span>[Mobile: %mobile% |] Phone: %telephone% MyReplacement2</span>
于 2012-12-02T21:49:28.597 に答える