Отдельные символы Unicode и ASCII с пробелами - PullRequest
0 голосов
/ 03 октября 2018

Я занимаюсь разработкой класса C ++ в C ++ Builder для сингальского переводчика Unicode.Я хочу разделить смешанную строку 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);

1 Ответ

0 голосов
/ 03 октября 2018

Ваш C ++ pattern не соответствует вашему C # pattern.

В C # префикс дословно *1007* *1007* позволяет вам писать строковые литералы без необходимости явно экранировать зарезервированныесимволы, такие как \.

В вашем коде C ++ вы не экранируете ни один из символов \, поэтому многие из них рассматриваются как escape-последовательности вместо фактических \ символов.Вам нужно экранировать действительные \ символы как \\ в строковых литералах, например:

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]))#";

При этом обратите внимание, что TRegEx в C ++ Builder внутренне использует библиотеку PCRE с открытым исходным кодом , поэтому проверьте его документацию на предмет поддерживаемого синтаксиса выражений регулярных выражений.

...