[^A]
не работает из-за обратной связи. \s*
соответствует нулевому или более пробелам, а затем возвращается назад, для размещения non-A
. Поскольку после =
есть два пробела, второе пространство совпадает с [^A]
-> есть совпадение.
См Шаг 12 & 13 (regex demo):
Если вы хотите, чтобы провалить матч, когда есть A
после =
, вам нужен отрицательный предпросмотр:
changes\s*=(?!\s*A)\s*.*
^^^^^^^^
См. another demo
Или другое изменение PCRE: changes\s*=\s*+(?!A).*
(проверьте, не является ли символ A
после пробелов после =
).
Если движок регулярных выражений поддерживает атомные группы или притяжательные кванторы, вы можете сделать вашу регулярное выражение работу путем предотвращения возвратов в \s*
конструкции:
changes\s*=\s*+[^A].*
^^ (possessive quantifier)
changes\s*=(?>\s*)[^A]\s*.*
^^ ^- atomic group
И в случае, если ваш двигатель не поддерживает атомные группы, ни притяжательные кванторы, вы можете отключить возвраты с помощью комбинации группы захвата/обратной ссылки (для эмуляции атомной группы):
changes\s*=(?=(\s*))\1[^A].*
См this demo.
Тем не менее, первое решение с lookahead предпочтительнее, поскольку оно кажется самым универсальным. Самый быстрый вид - тот, у кого есть притяжательный квантификатор.
'' '' (два пространства) соответствуют '\ s * [^ A]' (любое количество пробелов, за которым следует что-то не A, пробел не равен A) – deceze
(и даже если бы было только одно место, оно все равно соответствовало бы ...) –
Указанный на другом представлении: он избежит '= A' без пробела между = и A – Tensibai