Замена регулярных выражений C# с игнорированием совпадений, найденных в строковых кавычках ⇐ C#
Замена регулярных выражений C# с игнорированием совпадений, найденных в строковых кавычках
Я работаю в приложении, где системные администраторы могут создавать настраиваемые поля и настраивать вычисления для разрешения значений в этих полях. Эти вычисления сохраняются как строковое свойство объекта 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", ""))))
Я работаю в приложении, где системные администраторы могут создавать настраиваемые поля и настраивать вычисления для разрешения значений в этих полях. Эти вычисления сохраняются как строковое свойство объекта 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", ""))))
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Замена регулярных выражений C# с игнорированием совпадений, найденных в строковых кавычках
Anonymous » » в форуме C# - 0 Ответы
- 58 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Замена регулярных выражений C# с игнорированием совпадений, найденных в строковых кавычках
Anonymous » » в форуме C# - 0 Ответы
- 49 Просмотры
-
Последнее сообщение Anonymous
-