2015-01-23 6 views
7

Есть ли способ получить libc6 функции regexp regcomp и regexec для правильной работы с многобайтовыми символами?многобайтовые символы в libc regcomp и regexec

Например, если мой шаблон является символами utf8 猫机+猫, поиск совпадения в закодированной по utf8 строке 猫机机机猫 не удастся, где он будет успешным.

Я думаю, что это происходит потому, что характер «s байт представление \xe6\x9c\xba и + является соответствие один или несколько байт \xba. Я могу заставить этот экземпляр работать, помещая круглые скобки вокруг каждого многобайтового символа в шаблоне, но поскольку это для приложения, я не могу требовать от пользователя этого.

Есть ли способ пометить шаблон или строку для соответствия содержанию символов utf8? Возможно, сообщите libc, чтобы сохранить шаблон как wchar вместо char?

+0

Parens вокруг многобайтового символа не помогают? – stark

+0

Я могу это сделать, но я надеюсь на решение, которое не требует от пользователя изменения шаблона таким образом. Однако, спасибо! Я отредактировал вопрос, чтобы отразить ваш комментарий. –

+0

Почему бы просто не использовать кодовые страницы '\ x {nnnnnnn}'? То есть, если механизм регулярных выражений должен поддерживать Unicode. Обычно строка регулярных выражений и целевых строк должна использовать одну и ту же кодировку, но не рекомендуется использовать буквенные символы Unicode в строке регулярного выражения. Если двигатель поддерживает его, он читает символ в единицах char, а не в байтах. – sln

ответ

1

Можете ли вы использовать регулярное выражение для создания своего регулярного выражения? Вот пример Javascript, (хотя я знаю, что вы не используете JS):

function Examp() { 
 
    var uString = "猫机+猫+猫ymg+sah猫"; 
 
    var plussed = uString.replace(/(.)(?=[\+\*])/ig,"($1)"); 
 
    console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed); 
 
    uString = "猫机+猫*猫ymg+s\\a+I+h猫"; 
 
    plussed = uString.replace(/(\\?.)(?=[\+\*])/ig,"($1)"); 
 
    console.log("You can even take this a step further and account for a character being escaped, if that's a consideration.") 
 
    console.log("Starting with string: " + uString + "\r\n" + "Result: " + plussed); 
 
}
<input type="button" value="Run" onclick="Examp()" />

0

Есть ли способ, чтобы пометить шаблон или строку, чтобы соответствовать как содержащие utf8 символы?

Я подозреваю, что LC_CTYPE переменной среды (или другие соответствующие настройки локали) является way to make regcomp/regexec understand your encoding.

По крайней мере, grep программа, похоже, учитывает это, как показано в https://stackoverflow.com/a/40809461/94687; Я не тестировал это с помощью функции regcomp.