首页 > 解决方案 > 用空格分隔 Unicode 和 ASCII 字符

问题描述

我正在为僧伽罗语 Unicode 翻译器在 C++Builder 中开发一个 C++ 类。我想通过添加空格来拆分混合的 Unicode 和 ASCII 字符串。PHP 和 C# 正则表达式在 C++Builder 中不起作用。我的最后一个 PHP 请求已成功回答(将 Unicode 和 Ascii 字符与 PHP 中的空格分开)。我需要帮助来克服 C++Builder 中的这个问题。

这是我的 C# 代码,这段代码运行良好:

string pattern = @"\s+|(?<=[^\x20-\x7f])(?=[\x20-\x7f])|(?<=[\x20-\x7f])(?=[^\x20-\x7f])";

string[] substrings = Regex.Split("ලංකාABCDE TEST1දිස්ත්‍රික් වාණිජ්‍යTEMP මණ්ඩලය @ MNOPQ", pattern);

string text = string.Join(" ", substrings);

//text out put = ලංකා ABCDE TEST1 දිස්ත්‍රික් වාණිජ්‍ය TEMP මණ්ඩලය @ MNOPQ

到目前为止,这是我的 C++Builder 代码,但它不起作用:

const UnicodeString pattern = "#\s+|(?<=[^\x20-\x7f])(?=[\x20-\x7f])|(?<=[\x20-\x7f])(?=[^\x20-\x7f])#";
UnicodeString  text = L"ලංකාABCDE TEST1දිස්ත්‍රික් වාණිජ්‍යTEMP මණ්ඩලය @ MNOPQ";

//String str;

TStringDynArray substring = TRegEx::Split(text, pattern);

标签: regexc++builder

解决方案


您的 C++pattern与您的 C# 不匹配pattern

在 C# 中,@逐字前缀允许您编写字符串文字,而无需显式转义保留字符,例如\.

在您的 C++ 代码中,您没有转义任何\字符,因此其中许多被视为转义序列而不是实际\字符。您需要\\\字符串文字一样转义实际字符,例如:

const UnicodeString pattern = L"\\s+|(?<=[^\\x20-\\x7f])(?=[\\x20-\\x7f])|(?<=[\\x20-\\x7f])(?=[^\\x20-\\x7f])";

或者,如果您使用 C++Builder 的启用 C++11 的编译器之一,则可以使用原始字符串文字代替。您似乎试图通过用分隔符包围字符串内容来执行此操作,但是您忘记了附加到分隔符#的所需前缀和括号,例如:R

const UnicodeString pattern = LR"#(\s+|(?<=[^\x20-\x7f])(?=[\x20-\x7f])|(?<=[\x20-\x7f])(?=[^\x20-\x7f]))#";

话虽如此,请注意 C++BuilderTRegEx内部使用开源PCRE 库,因此请查看其文档以获取支持的正则表达式语法。


推荐阅读