Я построил сложное (для меня) регулярное выражение для анализа некоторых имен файлов, и оно в целом работает, за исключением случая, когда есть дополнительные внутренние скобки.
(?'field'F[0-9]{1,4})(?'term'\(.*?\))(?'operator'_(OR|NOT|AND)_)?
В следующих примерах мне нужно получить группы после комментария, но в 3-м примере я получаю ((brackets)
вместо ((brackets)are valid)
.
Что касается жизни, я не могу понять, как расширить ее, чтобы найти окончательный вариант скобки.
C:\Temp\[DB_3][DT_2][F30(green)].vsl // F30 (green)
C:\Temp\[DB_3][DT_2][F21(red)_OR_F21(blue)_NOT_F21(pink)].vsl // F21 (red) _OR_ OR
C:\Temp\[DB_3][DT_2][F21((brackets)are valid)].vsl // F21 ((brackets)are valid)
C:\Temp\[DB_3][DT_2][F21(any old brackets)))))are valid)].vsl // F21 (any old brackets)))))are valid)
C:\Temp\[DB_3][DT_2][F21(brackets))))))_OR_F21(blue)].vsl // F21 (brackets)))))) _OR_ OR
Спасибо
ОБНОВЛЕНИЕ: я использую RegExr для экспериментов, а затем реализую в C # так:
Regex r = new Regex(pattern, RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);
foreach(Match m in r.Matches(foo))
{
//etc
}
ОБНОВЛЕНИЕ 2: мне не нужно сопоставлять скобки. Внутри одного набора скобок могут быть любые данные, мне просто нужно, чтобы они заканчивались внешними скобками.
ОБНОВЛЕНИЕ 3:
Еще одна попытка, которая работает с дополнительными скобками (пример 3 и 4), но по-прежнему не позволяет выделить дополнительные термины (пример 5), но, к сожалению, включает в себя завершающий ]
в группе. Как я могу заставить его искать (но не включать) либо )_
, либо )]
в качестве разделителя, но просто включить скобку?
(?'field'F[0-9]{1,4})(?'term'\(.*?\)[\]])(?'operator'_(OR|NOT|AND)_)?
Окончательное обновление: я решил, что пытаться разобрать этот глупый формат не стоит, поэтому я собираюсь отказаться от его поддержки и сделать что-то более продуктивное с моим временем. Спасибо всем за помощь, теперь я видел свет!