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

Posted

技术标签:

【中文标题】在 C++Builder 中使用 boost::regex 提取双引号【英文标题】:Extract double quotes using boost::regex in C++Builder 【发布时间】:2014-11-30 18:05:50 【问题描述】:

我正在使用 C++Builder XE6 开发词法分析器,这就是我目前所做的:我有两个备忘录(memoINmemoOUT)。 memoIN 包含要分析的文本和 memoOUT 输出(tokens 的列表)。 首先,我使用 boost::regex 从所有 cmets 中删除 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)>

【问题讨论】:

【参考方案1】:

使用 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 用于内部文本操作,然后将其转换回UnicodeString 用于UI。例如:

// 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 使用 UTF-8 处理 AnsiString。 (字符编码足够复杂,可以作为自己的主题。)

【讨论】:

首先感谢您的快速回复,但对于我的情况 memoIN text type = UnicodeString 我不知道如何将其转换为应用您的代码,关于词法分析器生成器我无法使用它因为这是一项既定的工作,我们必须设计自己的 Lexer。 为了清楚我正在使用的东西c++ builder XE6没有main方法没有return没有cout @rep - 我更新了我的答案来处理UnicodeString。我意识到 maincout 没有在 C++Builder GUI 应用程序中使用,但是您可以使用 C++Builder 控制台应用程序,无论如何,这是说明概念的简单方法。 我不知道该说什么,谢谢 这个网站很棒,先生,你就是那个人。非常感谢会尝试你所说的(y)。 @rep:请注意,此解决方案未设置为正确处理带有转义序列的字符串。字符串文字通常设计为包含转义序列以指定不可打印的字符或字符串文字分隔符。

以上是关于在 C++Builder 中使用 boost::regex 提取双引号的主要内容,如果未能解决你的问题,请参考以下文章

在 C++Builder 中使用 C# .NET DLL?

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

在c++builder中使用indy编程,想要在邮件体内嵌入一个jpg图片,不用超链接的方法怎么实现。

#pragma once 等价于 c++builder

在 C++ Builder 中使用带有 BLOB 字段的图像和数据

在不可见的 C++Builder 应用程序中使用 ActiveX