2012-05-19 5 views
0

В одной из моих проблем, которые необходимо решить, мне нужно подставить значения своего диапазона в Формуле Excel с их эквивалентными ссылками на ячейки, то есть, например, если у меня есть формула Excel:Регулярное выражение в соответствии с формулой Excel

= Sum (F10: F14)

Я должен заменить его:

= Сумма (F10, F11, F12, F13, F14).

Я пытаюсь соответствовать регулярные выражения, которые помогают мне найти

  1. если формула 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), то есть для случаи, связанные с операторами нескольких диапазонов в формуле

Просьба помочь мне узнать, как я мог бы достичь вышеуказанного результата?

Приветствия, Anil

+0

Я предполагаю, что это гонорары - иначе это очень странный вопрос – brettdj

ответ

1

В первой, я предлагаю использовать более простое регулярное выражение, как:

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

(я не знаю, если первенствует поддерживает нежадным кванторы, если это Безразлично «т, использовать * вместо *?, также будет работать - но менее эффективная)

Это будет также соответствовать SUM с любых содержания кроме interva ls, который может быть или не быть тем, что вы хотите. Если должны быть Justs клетки или интервалы, регулярное выражение будет намного сложнее, но это выполнимо: вам просто нужно разбить его на эти два простых случаях вместе по ИЛИ:

  • один интервал, нулевые или более интервалы или ячейки, начинающиеся с запятой;
    • \w+:\w+(,\w+(:\w+)?)*
  • одна клетка, ноль или более ячеек, которые начинаются с запятой, интервал, начиная с запятой, интервалы или клетки, начинающиеся с запятой) ноль или более.
    • \w+(,\w+)*,\w+:\w+(,\w+(:\w+)?)*

Edit: Nevermind, что вы можете упростить его:

  • ноль или более ячеек заканчивается запятой
    • (\w+,)*
  • один интервал
    • \w+:\w+
  • ноль или более клеток или интервалы, начинающиеся с запятой
    • (,\w+(:\w+)?)*

Результат:

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

P.S. Я не знаю, нужно ли вам скрывать запятые или двоеточия.

1

Excel позволяет иметь блоки ячеек и отдельных клеток, происходя для ответа @mgibsonbr «ы смогу с:

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

Это также гарантирует, что у вас есть только две ячейки для диапазона ... т.е. , не a2: a3: a4

Смежные вопросы