regex - 用空格分隔 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);
解决方案
您的 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 库,因此请查看其文档以获取支持的正则表达式语法。
推荐阅读
- flutter - 小部件未在颤动中显示
- google-sheets - Google 表格:如何删除多列中包含重复数据的行?
- c++ - 生成 Visual Studio 项目文件时出错(用于 Unreal 的 .sln)
- node.js - 获取 Matterjs 元素
- material-ui - 如何在 Datagrid 中获取有关列可见性更改的更新架构。(材料用户界面)?
- google-bigquery - `instanceof Date` 在 BigQuery UDF 中的行为不符合预期
- microsoft-graph-api - 有没有办法通过 Graph Api 在 MS Bookings 上找到日历的时区
- sql - 如何动态使用 SSIS 表达式中的表
- ansible - CentOS 容器中的奇怪行为
- java - 如何使用 Hashmap 的 @DynamoDBAttribute