【问题标题】:How to find characters that cannot be part of a word in a Unicode string?如何在 Unicode 字符串中查找不能成为单词一部分的字符?
【发布时间】:2011-06-23 14:27:59
【问题描述】:

我在一个字符串中有一些文本,我需要检查该特定字符串是否包含任何不允许组成单词的字符。

假设我有类似“(hello}”的文本

这里它包含符号“(”和“}”。我怎么能在 C++ 中做到这一点。字符串可能包含任何 unicode 字符。

【问题讨论】:

  • 什么是“允许造字”的字?只是字母?数字?下划线?空间?标点符号?对于字母,请参见 isalphaiswalpha
  • 要么我没有正确理解您的问题,要么您正在寻找 C++ 中的正则表达式。如果这是真的,看看这个帖子:stackoverflow.com/questions/181624/…
  • boost::regex、libpcre 或只是简单的 strspn/strcspn、strpbrk...
  • 您能否进一步详细说明哪些字符“可以造词”?

标签: c++ unicode


【解决方案1】:

如果字符串真的包含 Unicode (UTF-8),那么问题肯定是 不平凡的;您可能需要使用一些外部库,例如 重症监护室。或者您可以转换为wchar_t (wstring),并使用单 字节编码解决方案如下:

如果字符是单字节编码的,std::find_if 带有 合适的谓词应该可以解决问题。如果你正在做任何文字 解析,你会想要定义为一组这样的谓词,一次又一次 全部;谓词可以使用std::ctype 方面的函数 locale,或wctype.h 中的那些(使用全局语言环境)。

不过,如果您正在处理 Unicode,甚至转换为宽 字符可能还不够,因为完整的 Unicode 仍然可以使用超过 一个代码点来表示单个字符。真正的问题是 你想这样做有多严重。 (另请注意,在许多语言中, 像英语或法语一样,“单词”可以包含 Unicode 字符 考虑标点符号,例如“不要”或“aujourd'hui”——Unicode 表格会告诉您'\'' 是标点符号,而不是单词的一部分。)

【讨论】:

  • 可能是我没有正确解释我的需求。我必须解析一个文件才能从中造出单词。这个词可以是任何语言。我已经检查了将单词与文本分开的空间。但这似乎还不够。假设我有一个像“我的名字(vivek”)这样的文本,那么这里我用三个词 my、name 和 vivek。我需要一些通用的解决方案。我需要知道如何处理这些事情。
  • 嗯,最大的问题是定义一个单词中可以或不能是什么字符。你接受“不要”这个词吗?然后你必须在你的谓词中添加一些特殊情况。您是否接受单词中带有抑扬音符号的“x”?如果是这样,即使使用宽字符,您也必须处理多码序列(因此您不能使用 find_if。如果您不能保证输入中的特定规范化格式,同样的情况也适用。
【解决方案2】:

std::isalpha(和相关的is* 朋友)以字符类型为模板,并接受语言环境以提供更好的本地化能力。我只会遍历 stringwstring 并使用 is* 函数来指示您感兴趣的行为(我无法从问题陈述中分辨出您想要允许和禁止哪些字符)。

【讨论】:

  • 出于基本目的,这也是我的建议。对于硬核无脚本限制的 Unicode 处理,ICU 之类的可能会更好,但这完全取决于您的情况。区域感知正则表达式听起来很性感。
【解决方案3】:

使用std::wstringstd::iswalpha()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 2021-02-15
    • 2021-01-22
    • 1970-01-01
    • 2015-12-05
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多