如何使用RE2找到匹配字符串的偏移量?

时间:2012-08-11 22:56:01

标签: c++ regex re2

RE2是Google提供的现代正则表达式引擎。我想在当前使用gnuregex的程序中使用RE2。我遇到的问题是找出匹配的东西。 RE2返回的是匹配的字符串。我需要知道匹配的偏移量。我目前的计划是采用RE2返回的内容,然后在C ++字符串上使用find。但这似乎很浪费。我已经阅读了RE2手册,无法弄清楚如何做到这一点。有什么想法吗?

1 个答案:

答案 0 :(得分:11)

将结果存储在re2::StringPiece而不是std::string中。 .data()的值将指向原始字符串。

考虑一下这个程序。 在每个测试中,result.data()是指向原始const char*std::string的指针。

#include <re2/re2.h>
#include <iostream>


int main(void) {

  { // Try it once with character pointers
    const char *text[] = { "Once", "in", "Persia", "reigned", "a", "king" };

    for(int i = 0; i < 6; i++) {
      re2::StringPiece result;
      if(RE2::PartialMatch(text[i], "([aeiou])", &result))
        std::cout << "First lower-case vowel at " << result.data() - text[i] << "\n";
      else
        std::cout << "No lower-case vowel\n";
    }
  }

  { // Try it once with std::string
    std::string text[] = { "While", "I", "pondered,", "weak", "and", "weary" };

    for(int i = 0; i < 6; i++) {
      re2::StringPiece result;
      if(RE2::PartialMatch(text[i], "([aeiou])", &result))
        std::cout << "First lower-case vowel at " << result.data() - text[i].data() << "\n";
      else
        std::cout << "No lower-case vowel\n";
    }
  }
}