Быстрая замена строки на подстановочный знак - PullRequest
3 голосов
/ 01 ноября 2010

Преобразование старой программы в сайт ASP.NET c #.

У меня есть таблица, полная функций, и таблица, полная переменных с соответствующими значениями. Я написал функцию для оценки ответов, но мне нужно отформатировать формулы, чтобы передать переменную.

Например:

V(totalValue) * V(CoFriction(s)) ==>  V("totalValue") * V("CoFriction(s)")

Как заменить V(<variable>) на V("<variable>"). Возможны вложенные скобки!

Я попробовал регулярное выражение, как - V\([^\(\)]+\), только чтобы потерпеть неудачу на вложенном парене

Ответы [ 2 ]

2 голосов
/ 01 ноября 2010

Вы можете достичь этого в .net с помощью балансировочной группы:

string s = "V(totalValue) * V(CoFriction(s)) * V(a(()b)c()d((())))";

string vPattern =
@"V\(
(       #capturing group, for $1 to work
    (?:
        (?<open>\()|    #push to stack OR
        (?<-open>\))|   #pop from stack OR
        [^()]           #match anything else
    )+?
)
(?(open)(?!))   #assert there are not extra (
\)";

s = Regex.Replace(s, vPattern, "V(\"$1\")", RegexOptions.IgnorePatternWhitespace);

Регулярное выражение работает точно для опубликованных сценариев - оно с треском провалится, если ввод неправильный, поэтому вы предполагаете, что это так (особенно если у вас есть дополнительные закрывающие скобки).

1 голос
/ 01 ноября 2010

В прошлом я создавал такие библиотеки.Функция Regex, которую вы хотите, называется «балансировка групп».Есть хорошая запись на http://blog.stevenlevithan.com/archives/balancing-groups Я думаю, вы хотите что-то вроде этого:

V\((?>[^()]+|\( (?<Depth>)|\) (?<-Depth>))*(?(Depth)(?!))\)

Если я правильно помню, это по существу добавит парен в стек "Глубина", когда он увидитПарень, удалите его из стека «Глубина», когда он увидит близкого парня (если его нет в стеке, он провалится), а затем провал открытого парена не будет закрыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...