2015-09-14 3 views
0

Я пытаюсь разбить строку на C#, чтобы сделать ее логикой для моего кода. Строка:Нужна помощь для разбивки строки

if (x111 > 0) 
    then ((x111/ x222) >= 34 and (x222/x222) <= 4500) 
else (if (x333 equals 0) 
    then true else false) 

Я использую следующий код для других строк, и это работает прекрасно:

string query = "if (x111 > 0) then (x222 > 0) else true"; 
string result = query.Split(new string [] {"if", "then", "else" },StringSplitOptions.RemoveEmptyEntries); 

Выход:

(x111> 0)
(x222> 0)
true

Для моей выше строки есть проблема, что тогда условие содержит другую вложенную логику, и мне нужно разбить ее на логику. Могу ли я разбить его на основе "(" и ")", так что я смогу сохранить результаты для различных выражений, таких как , если then then else и вложенные условия.

+4

Возможно, что-то не так с вашим подходом/архитектурой, если вы пытаетесь написать собственный парсер ... что вы на самом деле пытаетесь сделать? – Nathan

+0

, каким должен быть outpuit строки если (x111> 0) затем ((x111/x222)> = 34 и (x222/x222) <= 4500) остальное (если (X333 равен 0) тогда правда еще ложь) ???? –

+0

Просто любопытно, но вы можете попробовать ['(? <= (?: if | then | else) \ s *) (?: \ ((?> [^()] + | \ ((? ) | \) (? <-number>)) * (? (Число) (?!)) \) | \ W +) '] (http://regexstorm.net/tester?p= (% 3f% 3c% 3d (% 3f% 3aif % 7cthen% 7celse)% 5cs *) (% 3f% 3a% 5с ((% 3f% 3e% 5b% 5e()% 5d% 2b% 7c% 5с ((% 3f% 3cnumber% 3e)% 7c% 5c) (% 3f% 3c номер% 3e)) * (% 3f (число) (% 3f!))% 5c)% 7c% 5cw% 2b) & я =, если + (+ x111 +% 3e + 0 +) +% 0d% 0a +++ затем + ((+ x111% 2f + x222) +% 3e% 3d + 34 + и + (+ x222 +% 2F + x222) +% 3c% 3D + 4500) +% 0d% 0aelse + (+ если + (+ X333 + равна + 0) +% 0d% 0a +++ +, то истинно + еще + ложь)). Однако, я думаю, вам действительно нужно написать собственный парсер. –

ответ

4

Вы пытаетесь создать парсер, используя строковые операции ... Это плохая идея и, вероятно, никогда не будет работать.

Я предлагаю вам использовать ANTLR, инструмент, созданный для создания грамматик и парсера/лексеров. Вы должны попробовать. Существует много примеров языков, включая C#, которые вы можете использовать в качестве запуска для своего собственного парсера языка.

+0

Все, что я пытаюсь сделать, это преобразовать бизнес-правило в логику C#. Таким образом, пытаясь сломать выражения разных операторов, а затем сохранить их в базе данных. Но приведенная выше формула довольно сложна. Должен ли я попытаться подсчитать индекс «(» и «)», а затем разделить строку. –

+10

@iSahilSharma заявление, подобное «все, что я пытаюсь сделать», не означает, что задача проста. «Все, что я пытаюсь сделать, - это подняться на гору Эверест ...» Разбор грамматики очень сложный, и вместо того, чтобы делать это вручную, почему бы не использовать такой инструмент, как ANTLR, который делает тяжелую работу для вас? Вы говорите: «Все, что я пытаюсь сделать, - это подняться на гору Эверест ... без баллонов с кислородом, и я найду еду и убежище по дороге». Мы говорим: «Все, что я пытаюсь сделать, - это подняться Гора Эверест ... поэтому я упаковываю лучшие материалы и нанимаю самых опытных шерпов в мире. «Какой из них имеет больше смысла? – dman2306

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

  • Нет связанных вопросов^_^