При работе с cmake лучше работать с одним большим CMakeLists.txt в корне проекта, или, как кажется, кое-где видно,
^(([a-z])(?1)\2|[a-z]?)$
Насколько я понимаю, это выражение должно соответствовать либо нулю, либо одному символу (каждая строка из менее чем 2 символов неявно является палиндромом, а также учитывать палиндромы с нечетной длиной в рекурсии) или два из тот же символ, разделенный рекурсией шаблона.
К сожалению, похоже, что это не работает таким образом, как вы можете видеть на www.ideone.com/a9T3F . Вместо этого только строки 2 n - 1 (т.е. пустая строка, a
, aaa
, aaaaaaa
, a 15 ) повторяющиеся символы соответствуют регулярному выражению.
Как ни странно, если я изменю свой шаблон так, чтобы рекурсия стала необязательной (например, ^ (([az]) (? 1)? \ 2 | [az]?) $
, см. www.ideone.com/D6lJR , он соответствует только строкам, в которых символ повторяется 2 n раз (например, пустая строка, a
, aa
, aaaa
, aaaaaaaa
, a 16 ).
Почему мое регулярное выражение не работает так, как я ожидал?
Примечание для людей, которым не терпится предложить не использовать регулярное выражение :
Суть этого вопроса - научиться правильно использовать рекурсивные регулярные выражения. Я знаю, что это неэффективный способ определить, является ли строка палиндромом, и я бы не стал использовать рекурсивное регулярное выражение, если бы мне по какой-то причине пришлось определять палиндромы в производственном коде; Мне просто интересно узнать больше о расширенных аспектах регулярного выражения.