我花了一些时间弄清楚pcre2界面,并认为我大部分时间都掌握了它。我想支持UTF32,已经建立了pcre2支持并将代码点宽度设置为32。

下面的代码是我将代码点宽度设置为8所获得的。
如何更改它以与UTF32一起使用?

#include "gtest/gtest.h"
#include <pcre2.h>

TEST(PCRE2, example) {
//iterate over all matches in a string
  PCRE2_SPTR subject = (PCRE2_SPTR) string("this is it").c_str();
  PCRE2_SPTR pattern = (PCRE2_SPTR) string("([a-z]+)|\\s").c_str();
  int errorcode;
  PCRE2_SIZE erroroffset;
  pcre2_code *re = pcre2_compile(pattern, PCRE2_ZERO_TERMINATED, PCRE2_ANCHORED | PCRE2_UTF, &errorcode,
                                 &erroroffset, NULL);
  if (re) {
    uint32_t groupcount = 0;
    pcre2_pattern_info(re, PCRE2_INFO_BACKREFMAX, &groupcount);
    pcre2_match_data *match_data = pcre2_match_data_create_from_pattern(re, NULL);
    uint32_t options_exec = PCRE2_NOTEMPTY;
    PCRE2_SIZE subjectlen = strlen((const char *) subject);
    errorcode = pcre2_match(re, subject, subjectlen, 0, options_exec, match_data, NULL);
    while (errorcode >= 0) {
      PCRE2_UCHAR *result;
      PCRE2_SIZE resultlen;
      for (int i = 0; i <= groupcount; i++) {
        pcre2_substring_get_bynumber(match_data, i, &result, &resultlen);
        printf("Matched:%.*s\n", (int) resultlen, (const char *) result);
        pcre2_substring_free(result);
      }
      // Advance through subject
      PCRE2_SIZE *ovector = pcre2_get_ovector_pointer(match_data);
      errorcode = pcre2_match(re, subject, subjectlen, ovector[1], options_exec, match_data, NULL);
    }
    pcre2_match_data_free(match_data);
    pcre2_code_free(re);
  } else {
    // Syntax error in the regular expression at erroroffset
    PCRE2_UCHAR error[256];
    pcre2_get_error_message(errorcode, error, sizeof(error));
    printf("PCRE2 compilation failed at offset %d: %s\n", (int) erroroffset, (char *) error);
  }

大概需要转换subjectpattern,并且result属于同一类型吗?我在pcre2 header 中找不到任何内容来表示对此的支持。
而且我猜subjectlen将不再仅仅是strlen

最后,我通过阅读一些文档和标题将这个示例放在一起,还有其他我应该做/值得知道的事情。

最佳答案

最后,在评估了RE2,PCRE2和ICU之后,我离开了pcre2,然后选择了ICU。它的unicode支持(到目前为止,我所看到的)比其他两个更加完善。它还提供了一个非常干净的API和许多用于操纵的实用程序。重要的是,像PCRE2一样提供了perl样式的正则表达式引擎,该引擎开箱即用,可与unicode一起使用。

关于c++ - pcre2 UTF32的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30019651/

10-12 01:55