0

解決すべき問題の 1 つとして、Excel 数式の範囲値を同等のセル参照に置き換える必要があります。たとえば、Excel 数式がある場合は次のようになります。

=合計(F10:F14)

私はそれを置き換える必要があります:

= Sum(F10,F11,F12,F13,F14)。

見つけるのに役立つ正規表現を一致させようとしています

  1. 「Sum」と「:」を含むパターンで Excel 数式が定義されている場合
  2. F10:F14 のように、範囲に含まれるセルを抽出するには

どういうわけか、私はポイント1で立ち往生しています:-)

このために、次のパターンを作成しました。

Regex formulaMatcher = new Regex(@"=*SUM\([\w]*[\w,]*[\w]+:[\w]+[\w]*[\w,]*\)*");
foreach (Match m in formulaMatcher.Matches("=SUM(F55,F151:F159)"))
    m.Value.Dump();

これで、上記のパターンは式に対して完全に機能します。

        // =SUM(F15,F25,F31:F35)
        // =SUM(F10:F12,F26,F31)
        // =SUM(F45,F55,F61:F63,F40)
        // =F14-SUM(F16:F17)
        // =SUM(F35:F37)
        // =SUM(F10:F13)-F11
        // =SUM(F27:F29)/3
        // =F19-F21+SUM(F22:F23)
        // =ROUND(F43-SUM(F23:F42),2)
        // =SUM(F174:F178)+F134+F120+F97

ただし、次の場合は失敗します: SUM(F81:F89,F105:F113,F128:F135)、つまり、式内に複数の範囲演算子が含まれる場合

上記の結果を達成する方法を見つけるのを手伝ってください。

乾杯、アニル

4

2 に答える 2

1

最初は、次のような単純な正規表現を使用することをお勧めします。

Regex formulaMatcher = new Regex(@"=*SUM\(.*?[\w]+:[\w]+.*?\)*");

(Excelが貪欲でない量指定子をサポートしているかどうかはわかりません。サポートしていない場合は、*の代わりに使用して*?も機能しますが、効率は低下します)

これは、間隔以外のコンテンツにも一致SUMます。これは、必要なものである場合とそうでない場合があります。それがただのセルまたは間隔でなければならない場合、正規表現はより複雑になりますが、それは実行可能です.2つの単純なケースに分解するか、一緒にする必要があります:

  • 1 つの間隔、コンマで始まる 0 個以上の間隔またはセル。
    • \w+:\w+(,\w+(:\w+)?)*
  • 1 つのセル、コンマで始まる 0 個以上のセル、コンマで始まる間隔、0 個以上の間隔、またはコンマで始まるセル)。
    • \w+(,\w+)*,\w+:\w+(,\w+(:\w+)?)*

編集:気にしないでください。次のように簡略化できます。

  • コンマで終わる 0 個以上のセル
    • (\w+,)*
  • 1インターバル
    • \w+:\w+
  • コンマで始まる 0 個以上のセルまたは間隔
    • (,\w+(:\w+)?)*

結果:

Regex formulaMatcher = new Regex(@"=*SUM\((\w+,)*\w+:\w+(,\w+(:\w+)?)*\)*");

PSコンマやコロンをエスケープする必要があるかどうかはわかりません。

于 2012-05-19T06:34:13.810 に答える
1

Excel では、セルのブロックと単一のセルを使用できます。これは、@mgibsonbr の回答に由来しています。

^=SUM\((\w+\d+)((:\w+\d+)|(,\w+\w+)*)((,\w+\d)((:\w+\d+)|(,\w+\w+)*))*\)$

これにより、範囲に対して2つのセルしかないことも確認されます...つまり。a2:a3:a4 ではない

于 2013-02-20T19:47:16.823 に答える