Ваша первая проблема заключается в том, что вам нужно три (возможно, четыре) случая в вашем чередовании, а не два.
/\breverse!(?:\s|$)/
обратный! само по себе
/\bpush\b/
толчок сам по себе
/\breverse!push\b/
вместе
/\bpushreverse!(?:\s|$)/
это возможный случай
Ваша вторая проблема в том, что \b
не будет совпадать после "!"
, потому что это не \w
. Вот что Perl 5 должен сказать о \b
, вы можете обратиться к своим документам, чтобы узнать, согласны ли они:
Граница слова ("\ b") - это точка между двумя символами, у которой "\ w" на одной стороне и "\ W" на другой стороне (в любом порядке), считая воображаемые символы в начале и конце строки совпадают с "\ W". (Внутри символьных классов "\ b" представляет символ возврата, а не границы слова, как это обычно делается в любой строке в двойных кавычках.)
Итак, регулярное выражение, которое вам нужно, это что-то вроде
/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;
Я пропустил /s
, потому что в этом регулярном выражении нет периодов, поэтому рассматривать его как одну строку не имеет смысла. Если /s
не означает трактовать как одну строку в вашем движке, вы, вероятно, должны добавить его обратно. Кроме того, вы должны прочитать о том, как ваш двигатель обрабатывает чередование. Я знаю, что в Perl 5, чтобы получить правильное поведение, вы должны расположить предметы таким образом (в противном случае задний ход! Всегда побеждает задний ход! Толчок).