Соответствует символу Юникод в регулярном выражении Zsh - PullRequest
4 голосов
/ 17 декабря 2011

Я хочу убедиться, что переменная не содержит определенного символа (в данном случае 'α'), но следующий код завершается ошибкой (возвращает 1):

FOO="test" && [[ $FOO =~ '^[^α]*$' ]]

Редактировать: Изменен шаблон на основе обратной связи от Stema, приведенной ниже, чтобы требовать сопоставления только символов, отличных от «α», от начала до конца.

Замена «α», например, «x», работает как ожидалось.Почему он не работает с «α» и как я могу заставить эту работу работать?

Информация о системе:

$ zsh --version
zsh 4.3.11 (i386-apple-darwin11.0)
$ locale
LANG="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_CTYPE="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_ALL="en_GB.UTF-8"

Редактировать 2: Я сейчас тестировал на машине с Linux, работающей под управлениемUbuntu 11.10 с zsh 4.3.11 с идентичными настройками локали, и там все работает - т.е. FOO="test" && [[ $FOO =~ '^[^α]*$' ]] возвращает успех.Я использую Mac OS X 10.7.2.

Ответы [ 3 ]

1 голос
/ 18 декабря 2011

с этим регулярным выражением .*[^α].* вы не можете проверить, что α отсутствует в строке. Это тестирование: есть ли в строке один символ, который не является α.

Если вы хотите проверить, что в строке нет этого символа, сделайте это

FOO="test" && [[ $FOO =~ '^[^α]*$' ]]

это проверит, состоит ли полная строка из начала и до конца не из символов «α».

0 голосов
/ 12 апреля 2017

По какой-то причине у меня возникла аналогичная проблема в моей системе сборки, при этом на моем ноутбуке была установлена ​​версия 5.0.2 ZSH (где Unicode работает должным образом) и ZSH 4.3.17 в моей системе сборки.Мне кажется, что в ZSH 5 нет проблемы с символами Юникода в шаблонах регулярных выражений.

В частности, при разборе пары ключ / значение:

[[ "revision/author=Ľudovít Lučenič" =~ '^([^=]+)=(.*)$' ]]
echo "$match[1]:$match[2]"

рендерит

:                               # ZSH 4.3.17
revision/author:Ľudovít Lučenič # ZSH 5.0.2

Кроме того, я предполагаю некоторые недостатки с поддержкой Unicode ZSH 4.

Обновление: После некоторого исследования я обнаружил, что точка в регулярном выражении не соответствует букве'č' в ZSH 4. Как только я обновил шаблон:

[[ "revision/author=Ľudovít Lučenič" =~ '^([^=]+)=((.|č)*)$' ]]
echo "$match[1]:$match[2]"

Я получаю одинаковый результат в обеих версиях ZSH.Я не знаю, однако, почему именно это письмо является проблемой здесь.Тем не менее, это может помочь кому-то обойти этот недостаток.

0 голосов
/ 18 декабря 2011

Самый простой способ выразить это с помощью отрицательного упреждающего просмотра, закрепленного в начале:

^(?!.*α)

Это говорит: «глядя вперед с самого начала, я не должен видеть»1004 * в любом месте.

Преимущество использования look-head в том, что они не захватывают, поэтому вы можете комбинировать их с другими регулярными выражениями захвата, например, чтобы найти группы чисел в кавычках во входных данных, которые не делаетt содержит α, используйте это: ^(?!.*α)"(\d+)"

...