在 C++Builder 中使用 boost::regex 提取双引号

Extract double quotes using boost::regex in C++Builder

本文关键字:regex 提取 boost C++Builder      更新时间:2023-10-16

我正在使用C++Builder XE6研究词法分析器,这就是我到目前为止所做的:我有两个备忘录(memoIN,memoOUT)。memoIN 包含要分析的文本,并 memoOUT 输出(标记列表)。首先,我使用 boost::regex 从所有评论中删除 memoIN 内容,这就像一个魅力。现在我坚持如何从文本中提取所有双引号并将它们显示为输出备忘录中的字符串。

到目前为止,iIhave只是一个表达式,它删除了所有双引号,但不是我需要的,我需要提取主题并显示主题,例如:

备忘录 :

This is a "Double" Quote and this is "another one"

备忘录 :

<(String "Double") #Line 01 #Length 06)>
<(String "another one") #Line 01 #Length 11)>

使用 Boost.Regex

下面是一些示例代码,演示如何使用 boost::regex 提取引号内的文本。

#include <string>
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
using namespace boost;
int main(int argc, char **argv) {
  // Capture any non-quotes that occur within double quotes.
  boost::regex re(""([^"]+)"");
  // Input text
  std::string memoIN = "This is a "Double" Quote and this is "another one"";
  // Iterate through memoIN
  boost::sregex_iterator m1(memoIN.begin(), memoIN.end(), re);
  // Ending iterator (using the default constructor)
  boost::sregex_iterator m2;
  for (; m1 != m2; ++m1) {
    // Replace this with code to organize memoOUT
    std::cout << (*m1)[1].str() << std::endl;
  }
  return 0;
}

使用词法分析器库

根据你的需求有多复杂,你可能会发现,从长远来看,使用专用的词法分析和解析器生成器(如ANTLR3 C)比使用Boost.Regex编写自己的词法器和解析器生成器更好。

与 UnicodeString 接口

有几种方法可以处理 C++Builder 的AnsiStringUnicodeString与标准C++的std::stringstd::wstring之间的不匹配。一种简单的方法是将UnicodeString转换为std::string以进行内部文本操作,然后将其转换回 UI 的UnicodeString。 例如:

// Use AnsiString to convert from UTF-16 to a narrow character encoding
std::string memoIN_text = AnsiString(MemoIN->Text).c_str();
std::string memoOUT_text;
// Insert Boost.Regex manipulation here and assign the results to memoOUT_text
// Use implicit conversion from const char* to AnsiString/UnicodeString
MemoOUT->Text = memoOUT_text.c_str();

从Unicode转换为ANSI可能会丢失数据,因此您可能需要使用SetMultiByteConversionCodePage告诉C++Builder对AnsiString使用UTF-8。 (字符编码非常复杂,可以成为它自己的主题。