Я когда-то ответил на вопрос о соответствии строки с кавычками.
Кажется, что есть случаи, которые зависают на .NET и сбой на Mono (с OutOfMemoryException
), например:
var reg = new Regex(@"^""([^\\""]*(\\"")*(\\[^""])*)*""");
reg.Match("\" ");
Два вопроса:
1) почему это происходит?
2) как улучшить это регулярное выражение? Я хочу, чтобы он сохранил все "функции".
Это действительно (cf Tim S.) катастрофическое возвращение с этой частью вашего шаблона: (\\[^""])*)*
, который позволяет все, что возможно в мире, и заставить двигатель регулярных выражений попробовать слишком много возможностей. (Лучшие иллюстрации можно найти, если вы следуете ссылке Тима С.)
Другой шаблон для этого:
var reg = new Regex(@"(?s)""(?>[^\\""]+|\\{2}|\\.)*""");
(Идея состоит в том, чтобы сопоставить все четное число обратных косых черт (вторая часть чередования), прежде чем разрешить реальным экранированным символам (третья часть чередования).)
abc "def" "g\"hi" "jkl\\" "mn\\\"o"
. Результат должен быть: def
, g"hi
, jkl\`,
mn \ "o`.