Регулярное выражение, исключающее определенные символы

В этом уроке я не понимаю, почему [^b] не правильно? Я понимаю, что [^bog] правильно.

[^b] должно соответствовать любой строке, которая не имеет символа b и не соответствует ни одной строке, содержащей символ b.

Что-то не так в моем понимании?

Ответ 1

Для этого конкретного урока правильное regex:

[^b]og

ОБЪЯСНЕНИЕ:

/[^b]og/

[^b] match a single character not present in the list below
b the literal character b (case sensitive)
og matches the characters og literally (case sensitive)

ЗАМЕТКИ:

Классы отрицательных персонажей

Ввод каретки после открывающей квадратной скобки отменяет класс персонажа. В результате класс символов соответствует любому символу, которого нет в классе символов. В отличие от точки, классы отрицанных символов также соответствуют (невидимым) символам разрыва строки. Если вы не хотите, чтобы отрицательный класс символов соответствовал разрывам строк, вам необходимо включить символы разрывов строк в класс. [^ 0-9\r\n] соответствует любому символу, который не является цифрой или переводом строки.

Важно помнить, что класс отрицанных символов все еще должен соответствовать символу. q [^ u] не означает: "за aq не следует au ". Это означает: " aq сопровождается символом, который не является au ". Он не соответствует q в строке Ирак. Он соответствует q и пробелу после q в Ираке является страна. Действительно: пробел становится частью общего соответствия, потому что именно " символ, который не является au ", соответствует классу отрицанных символов в приведенном выше регулярном выражении. Если вы хотите, чтобы регулярное выражение соответствовало q, и только q, в обеих строках, вам нужно использовать отрицательный прогноз: q (?! U). Но мы вернемся к этому позже.

Ответ 2

Вы в корне верны, но [^b] по-прежнему будет соответствовать o и g в bog - это означает, что это успешное совпадение, хотя оно не соответствует всей строке. [^bog] будет соответствовать только h в hog, d в dog, а ничего в bog - означает, что он не соответствует bog.

Я думаю, что это будет иметь больше смысла, если вы посмотрите ^[^b]+$. Это будет соответствовать символам 1+ non b, привязанным к началу (^) и концу ($) строки. Сравнивая это с вашим первоначальным выражением [^b] или [^bog], вы можете увидеть разницу. Я предлагаю использовать GUI RegEx тестер (ранее связанный один из них мой любимый), что действительно поможет проиллюстрировать логику.

Ответ 3

[^b] будет соответствовать только одному символу, который не является "b" .
[^b]+ будет указывать, что группа RegEx соответствует одному или нескольким символам, которые не являются "b" .
[^b]* будет указывать, что группа RegEx соответствует нулевому или более символам, которые не являются "b" .

Ответ 4

^[^b] работает.

^ ВНЕЕ [] указывает "начало строки"