Как сопоставить пустую строку с помощью Delphi (10.3) TRegEx.IsMatch?
Следующие случаи возвращают false там, где я ожидал бы вернуть true:
fDoesMatch := TRegEx.IsMatch('', '^$');
fDoesMatch := TRegEx.IsMatch('', '^.{0}$');
fDoesMatch := TRegEx.IsMatch('', '\A\z');
Как я видел в документах https://docwiki.embarcadero.com/Libraries/Sydney/en/System.RegularExpressions.TRegEx Delphi использует библиотеку C «PCRE» для выполнения регулярных выражений.
Попытка найти шаблоны регулярных выражений на https://regex101.com/ соответствует, поэтому мне интересно, почему это не работает с Delphi
@ Ineffable21 Спасибо за ваши предложения. Начиная с regex101.com шаблон ^$ соответствует только пустой строке (пробовали варианты PCRE и PCRE2). Что касается документов из TRegEx.IsMatch, порядок аргументов правильный и работает с некоторыми другими шаблонами, которые я пробовал. Использование строковой переменной вместо литерала приводит к такому же поведению.





TRegEx по умолчанию не соответствует пустым строкам, так как создается с недокументированнойroNotEmpty опцией.
Вы должны явно исключить опцию roNotEmpty, чтобы включить совпадения пустых строк:
fDoesMatch := TRegEx.IsMatch('', '^$', []);
Решение использовать [roNotEmpty] по умолчанию было принято для обеспечения обратной совместимости со старыми версиями Delphi. См. Тонкое изменение Delphi TRegEx.
Спасибо, Питер, это так. Я наблюдал за roNotEmptyвариантом. При исключении этой опции, как вы описали, пустая строка может сопоставляться, например. ^$
На самом деле я не использовал RegEx, но, согласно предоставленной вами документации, кажется, что вы пытаетесь увидеть, существует ли шаблон '^$' во входных данных '', чего нет, то есть вы должны получить false , как ты делаешь. Вы пробовали менять местами строки или пробовали добавить реальную строку в качестве ввода вместо пустой?