Замена регулярных выражений C# с игнорированием совпадений, найденных в строковых кавычкахC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Замена регулярных выражений C# с игнорированием совпадений, найденных в строковых кавычках

Сообщение Anonymous »


Я работаю в приложении, где системные администраторы могут создавать настраиваемые поля и настраивать вычисления для разрешения значений в этих полях. Эти вычисления сохраняются как строковое свойство объекта CustomField. Мне поручено провести массовую очистку этих вычислений, в основном сосредоточившись на замене функций и операторов конъюнкции на их сокращенные варианты. Я хочу использовать метод RegEx.Replace() для решения этой задачи в решении .NET C#.

Пример строки расчета (пользователи вводят Calc в синтаксисе VB.NET):

IIF([FIELD1] = «Это и то» AND [FIELD2] = «Это или то», «Значение 1», IIF ([FIELD3] = «Это и то» ИЛИ [FIELD4] = «Это или то», «Значение 2», "")) Требования задачи:
[*]Замены: IIF -> IF, And -> AndAlso, Or -> OrElse [*]Поиски/совпадения не должны учитывать регистр для всех выполняемых замен, поскольку разные администраторы используют разный регистр при написании синтаксиса. [*]Для функции IIF необходимо найти «IIF(» (синтаксис с левой скобкой сразу после «F»), а затем также найти совпадения с любым переменным количеством пробелов между «F» и левой круглой скобкой. Это основано на наблюдениях за тем, как я вижу вычисления, написанные в среде моего клиента. [*]Для обеих фраз И/ИЛИ необходимо найти экземпляры с начальным/конечным пробелом и убедиться, что фраза не является частью строки в кавычках. Таким образом, в приведенном выше примере строки вычисления допустимые операторы соединения будут заменены, но строки и/или в «Это и то» и «Это или это» будут проигнорированы и пропущены.
Ниже приведен пример того, что у меня есть в качестве отправной точки. Я считаю, что у меня правильный шаблон функции IIF, используя «альтернативный» | символ канала, чтобы выполнить сопоставление «или/или» для этой фразы, но я застрял в том, как настроить шаблоны «И/ИЛИ», чтобы исключить замену совпадений, содержащихся в строках.

foreach (CustomFieldInfo customField в Session.ConfigurationManager.GetCustomFields(false)) { строка fieldCalcStr = customField.Calculation.Trim(); если (string.IsNullOrEmpty(fieldCalcStr)) продолжить; fieldCalcStr = Regex.Replace(fieldCalcStr, @"IIF\(|IIF *\(", "IF(", RegexOptions.IgnoreCase); fieldCalcStr = Regex.Replace(fieldCalcStr, «AND», «AndAlso», RegexOptions.IgnoreCase); fieldCalcStr = Regex.Replace(fieldCalcStr, «OR», «OrElse», RegexOptions.IgnoreCase); customField.Calculation = fieldCalcStr; } ПРИМЕЧАНИЕ. Здесь я видел множество сообщений, в которых люди пытались выполнить что-то относительно похожее, но во всех случаях ответы были очень специфичны для входной строки, предоставленной ОП, и делали предположения, которые отображали предлагаемые ответы. не применимо к моему случаю использования и конкретным требованиям.

Любая помощь приветствуется.

*** ОБНОВЛЕНИЕ ***

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

DictionarypatternReplacementDict = новый словарь(); PatternReplacementDict.Add("(?:IIF\\s*[(])", "IF("); PatternReplacementDict.Add("(?: AND )", " AndAlso "); PatternReplacementDict.Add("(?: OR)", " OrElse "); foreach (CustomFieldInfo customField в Session.ConfigurationManager.GetCustomFields(false)) { строка CalcStr = customField.Calculation.Trim(); если (string.IsNullOrEmpty(calcStr)) продолжить; string[]calcStrArray = Regex.Split(calcStr, "(\"[^\"]+\")"); строка newCalcStr = string.Empty; foreach (строка str в CalcStrArray) { если (!str.StartsWith("\"")) { строка newStr = ул; foreach (KeyValuePair kvp в шаблонеReplacementDict) { newStr = Regex.Replace(newStr, kvp.Key, kvp.Value, RegexOptions.IgnoreCase); } новаяCalcStr += новаяStr; } еще { новыйCalcStr += ул; } } customField.Calculation = newCalcStr; } Исходный ввод

IIF([FIELD1] = "Этот ""текст в кавычках" и это" AnD [FIELD2] = "Это или то", "Значение 1", iiF ([FIELD3] = «Это и то» и [FIELD4] = «Это или то», «Значение 2», IIF([FIELD4] = «Это и то» Или [FIELD5] = «Это или то», «Значение 3», Iif ([FIELD6] = «Это и то» илиR [FIELD7] = «Это или то», «Значение 4», "")))) Вывод
IF([FIELD1] = "Этот ""текст в кавычках"" и это" AndAlso [FIELD2] = "Это или то", "Значение 1", IF([FIELD3] = "Это и то" AndAlso [FIELD4] = "Это или то", "Значение 2", IF([FIELD4] = "Это и то" OrElse [FIELD5] = "Это или то", "Значение 3", IF([FIELD6] = "Это и то" OrElse [FIELD7] = "Это или то", "Значение 4", ""))))
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»