2012-06-11 3 views
0

мне нужно, чтобы иметь возможность вырезать условие в строке, здесь:Match состояние RegEx

(("${Operation}" == "Fixed") && ("-" == "-")) 

Я хотел бы быть в состоянии заменить "${Operation}" == "Fixed" с "" или что-нибудь между(), что имеет $ {}. Другими словами, если в левой части условия есть $ {}, я хочу полностью избавиться от этого условия.

+0

Это довольно гибкое описание проблемы. –

ответ

1

В общем, регулярное выражение не является правильным подходом здесь. Есть много случаев, которые являются допустимым синтаксисом JavaScript, но это не будет хорошо вписываться в регулярное выражение. Тем не менее, вот один из способов сделать это:

var code = '(("${Operation}" == "Fixed") && (thing1 == thing2))'; 
code = code.replace(/"[^"]*\$\{[^}]*\}[^"]*"\s*==\s*"[^"]*"/, 'true'); 

Это касается только двойных кавычек. Если вам нужно обрабатывать оба типа котировок, выражение будет более сложным. Если вам нужно обрабатывать оба типа котировок и, ваши строки могут содержать кавычки, тогда регулярное выражение действительно не будет работать.

Если вы можете подумать о другом способе решения этой проблемы, то вам следует. Например, откуда берется строка? Можете ли вы получить данные в другом формате?

Кроме того, похоже, что вы настраиваете эту строку для вызова eval. Это плохая идея, если она содержит какой-либо пользовательский ввод.

+0

Я могу изменить данные, которые передаются обратно, и я думал о том же, что и вы. Я настраивал строку для использования с '(новая функция (строка здесь)())' на самом деле. Возможно, мне придется создавать выражение на стороне клиента, а это то, что я изначально делал неудачно с ударом производительности ... Но спасибо за ваш ответ, что regex монстра – Ryan

+0

Я думал больше о возврате какой-то структуры данных JSON. Но все работает. – jnylen

+0

Пошел с разностным подходом. Я просто вернул данные в другом формате. Спасибо за помощь, хотя! – Ryan

1

Это будет соответствовать его

\([^(]*\${.*?}[^)]*\) 

enter image description here

+0

Я попробую это завтра спасибо – Ryan

0

С этим регулярным выражением /^\(?[^)&]*?\${.*\)/ Я успешно сопоставлял две первые строки, но не два других. Это то, что вы ищите?

(("$ {Операция}" == "Фиксированный") & & ("-" == "-"))

("$ {Операция}" == "Фиксированный"))

(("$ Операция" == "Fixed") & & ("-" == "-"))

(("-" == "-") & & ("$ {Operation} "==" Fixed "))

0

Интересно, я придумал /\(("?\${.*}"?[^)]*)\)/g:

'(("${Operation}" == "Fixed") && ("-" == "-"))'.replace(/\(("?\${.*}"?[^)]*)\)/g, '("")') 

это, вероятно, имеет слишком много *, но вопросы интернет кодирования всегда кажется немного широко открытыми в любом случае.

ПРИМЕЧАНИЕ: Это было похоже на тест в специальных символах RegExp, весело спасибо!

И единственное, что хранение тонущего корабля регулярного выражения, я написал это [^)]* ничего просто не закрывающая )