我正在C ++ Builder中为Sinhala Unicode转换器开发C ++类。我想通过添加空格来拆分Unicode和ASCII混合字符串。 PHP和C#正则表达式在C ++ Builder中不起作用。我的上一个PHP请求已成功回答(Separate Unicode and Ascii Charactors with White Space from 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);
答案 0 :(得分:2)
pattern
与您的C#pattern
不匹配。在C#中,@
verbatim prefix允许您编写字符串文字,而不必显式转义保留的字符,例如\
。
在C ++代码中,您没有转义任何\
字符,因此许多字符被视为escape sequences而不是实际的\
字符。您需要将实际的\
字符转义为字符串文字中的\\
,例如:
const UnicodeString pattern = L"\\s+|(?<=[^\\x20-\\x7f])(?=[\\x20-\\x7f])|(?<=[\\x20-\\x7f])(?=[^\\x20-\\x7f])";
或者,如果您使用的是C ++ Builder的C++11 enabled compilers之一,则可以改用raw string literal。您似乎尝试通过用#
分隔符将字符串内容括起来来尝试,但是您忘记了必需的R
前缀和附加在分隔符上的括号,例如:
const UnicodeString pattern = LR"#(\s+|(?<=[^\x20-\x7f])(?=[\x20-\x7f])|(?<=[\x20-\x7f])(?=[^\x20-\x7f]))#";
话虽如此,请注意,C ++ Builder的TRegEx
内部使用开源PCRE library,因此请查看其文档以获取受支持的正则表达式语法。