带空格的Unicode和ASCII字符分开

时间:2018-10-03 12:08:19

标签: regex c++builder

我正在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);

1 个答案:

答案 0 :(得分:2)

您的C ++ 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,因此请查看其文档以获取受支持的正则表达式语法。