ऐसा लगता है कि POSIX Regex UTF-8 लोकेल के साथ ठीक से काम कर रहा है। मैंने अभी एक सरल परीक्षण लिखा है (नीचे देखें) और रेगेक्स "[[:alpha:]]"
(उदाहरण के लिए) के खिलाफ एक सिरिलिक वर्णों के साथ स्ट्रिंग मिलान करने के लिए इसका इस्तेमाल किया है। और सब कुछ ठीक काम कर रहा है।
नोट: मुख्य बात आपको याद रखना चाहिए - रेगेक्स फ़ंक्शन लोकेल से संबंधित हैं। इसलिए आपको इससे पहले setlocale()
पर कॉल करना होगा।
#include <sys/types.h>
#include <string.h>
#include <regex.h>
#include <stdio.h>
#include <locale.h>
int main(int argc, char** argv) {
int ret;
regex_t reg;
regmatch_t matches[10];
if (argc != 3) {
fprintf(stderr, "Usage: %s regex string\n", argv[0]);
return 1;
}
setlocale(LC_ALL, ""); /* Use system locale instead of default "C" */
if ((ret = regcomp(®, argv[1], 0)) != 0) {
char buf[256];
regerror(ret, ®, buf, sizeof(buf));
fprintf(stderr, "regcomp() error (%d): %s\n", ret, buf);
return 1;
}
if ((ret = regexec(®, argv[2], 10, matches, 0)) == 0) {
int i;
char buf[256];
int size;
for (i = 0; i < sizeof(matches)/sizeof(regmatch_t); i++) {
if (matches[i].rm_so == -1) break;
size = matches[i].rm_eo - matches[i].rm_so;
if (size >= sizeof(buf)) {
fprintf(stderr, "match (%d-%d) is too long (%d)\n",
matches[i].rm_so, matches[i].rm_eo, size);
continue;
}
buf[size] = '\0';
printf("%d: %d-%d: '%s'\n", i, matches[i].rm_so, matches[i].rm_eo,
strncpy(buf, argv[2] + matches[i].rm_so, size));
}
}
return 0;
}
प्रयोग उदाहरण:
$ locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
... (skip)
LC_ALL=
$ ./reg '[[:alpha:]]' ' 359 фыва'
0: 5-7: 'ф'
$
मिलान परिणाम की लंबाई दो बाइट UTF-8 में सिरिलिक अक्षरों इतना लेता वजह से है।
स्रोत
2012-01-04 14:38:42
मुझे नहीं पता कि, लेकिन योजना 9 रेगेक्स लाइब्रेरी है; एक यूनिक्स पोर्ट http://swtch.com/plan9port/unix/ पर 'libregexp9' – Dave