Здравствуйте, WolfHound, Вы писали:
WH>WH>regex HighSurrogates = ['\uD800'..'\uDBFF'];
WH>regex LowSurrogates = ['\uDC00'..'\uDFFF'];
WH>regex Any = HighSurrogates LowSurrogates | ['\u0000'..'\uFFFF'];
WH>
Это вообще не верный код. Он автомат на первом символе всегда сожрет один любой.
Должно быть что-то вроде:
regex Any16 = ['\u0000'..'\uFFFF'];
regex HighSurrogate = ['\uD800'..'\uDBFF']; // DBFF - это граница корректного HighSurrogate
regex NonSurrogate = Any16 - HighSurrogate;
regex Any = HighSurrogate Any16 | NonSurrogate;
Вот тогда он сожрет или правильную сурогатную пару, или два отдельных символа, в которых может быть грязь.
DBFF — это граница корректного HighSurrogate все что между ним и DFFF — это некорректрый сурогат. Это значение должно встречаться в LowSurrogates.