Технически говоря, использование выражений диапазона, таких как [a-z]
, в регулярном выражении Posix (как с утилитой grep) имеет определенное поведение только в локали Posix (C).Это означает, что вы действительно не можете надежно использовать выражения диапазона в локали sv_SE
(или любой другой интернационализированной локали).Однако вы можете надежно использовать классы символов, такие как [[:lower:]]
, [[:alpha:]]
, [[:alnum:]]
и т. Д., И это обычно то, что вы должны делать.
Сказав это, я считаю, чтото, что вы испытываете, это действительно ошибка в glibc, появившаяся в v2.28, так как предыдущие версии sv_SE
локали правильно помещали w
в нижний регистр и W
в верхний регистр.Я думаю, что это изменение не соответствует ожиданиям пользователей, поскольку оно нарушит выражения диапазона регулярных выражений, которые ранее работали, как и ожидалось, несмотря на неопределенное поведение.
О проблеме сообщили как об ошибке glibc около месяца назад, и почти сразу же закрылиза отсутствием документации;вчера я попросил открыть его .( Обновление: , эта ошибка была переквалифицирована как дубликат другой ошибки, возможное решение которой может быть только комплексным решением основной проблемы проектирования. Другими словами, команда glibc понимает, что есть проблема, но незатаить дыхание для решения.)
Я поместил возможную замену sv_SE
файла определения локали в этого хранилища , на случай, если он окажется полезным для кого-то.Пожалуйста, не устанавливайте его, если у вас не возникли проблемы с определением локали из glibc.
В моем чрезмерно длинном комментарии в сообщении об ошибке, указанном выше, я попытаюсь изложить проблему, которая является скорее проблемой определения, чем реализацией,Основная проблема заключается в том, что очень трудно (если не невозможно) определить порядок сопоставления из одного символа, который полностью соответствует порядку сравнения всей строки.Читая между строк в обосновательном документе Posix, кажется очевидным, что многие люди ударялись головой об эту конкретную кирпичную стену, так и не сумев придумать практичное портативное предложение с консенсусом по реализации.(«Как отмечалось выше, были предприняты усилия для устранения различий, но не было найдено решения, которое было бы достаточно конкретным, чтобы позволить переносимое программное обеспечение, не нарушая при этом существующие реализации».)
Удачная очисткаразличные файлы определения локали привели к изменению порядка символов в шведской локали.Это не изменило порядок сортировки строк, так что V
и W
продолжают сортироваться как прежде (то есть, как будто они были вариантами написания одной и той же буквы, а не разными буквами), и это не изменилоОпределения CTYPE, поэтому W
и w
продолжают оставаться буквами (и, следовательно, соответствуют [[:alpha:]]
), как и прежде.Но это (случайно, я считаю) изменило порядок персонажа.Ранее W
следовал V
и w
следовал v
, так что W
соответствовал [U-X]
и w
соответствовало [u-x]
.Изменения поместили оба символа после символа «Торн» (þ), что означает, что оно не может соответствовать ни одному выражению диапазона.(Выражения диапазона Regex ограничены однобайтовыми кодовыми точками.)
A предыдущий вопрос был предложен в качестве дубликата этого вопроса, но я удалил маркер дубликата, потому что этот вопросфокусируется на разумности использования [a-z]
, а не на возможных ошибках реализации, а также потому, что речь идет о регулярных выражениях Perl, а не о регулярных выражениях Posix.Однако в ответах много полезной информации.