Как механизм регулярных выражений .NET обрабатывает смешанные строки RTL + LTR? - PullRequest
4 голосов
/ 20 октября 2011

У меня есть смешанная иврит / английская строка для анализа. Строка построена так:

[3 hebrew] [2 english 2] [1 hebrew],

Таким образом, его можно прочитать как: 1 2 3, и он сохраняется как 3 2 1 (точная последовательность байтов в файле, дважды проверяется в шестнадцатеричном редакторе, и в любом случае RTL - это только отображение атрибуты). Парсер регулярных выражений .NET имеет RTL-опцию , которая (если указана для простого текста LTR) начинает обработку с правой стороны строки.

Мне интересно, когда эта опция должна применяться для извлечения [3 иврита] и [2 английских] частей из строки, или чтобы проверить, совпадает ли [1 иврит] с концом строки? Есть ли какие-то скрытые особенности или не о чем беспокоиться (например, при обработке любой строки LTR со специальными символами Unicode)?


Кроме того, кто-нибудь может порекомендовать мне хороший текстовый редактор RTL + LTR? (боюсь, что VS Express иногда отображает неверный текст, и если он даже может начать испортить сохраненные строки - я хотел бы перепроверить файлы без использования шестнадцатеричных редакторов)

1 Ответ

3 голосов
/ 20 октября 2011

Параметр RightToLeft относится к порядку в последовательности символов, который принимает регулярное выражение, и должен действительно называться LastToFirst, поскольку в случае иврита и арабского языка он фактически слева направо и со смешанным Текст RLT и LTR, такой как вы описываете выражение «справа налево», еще менее уместен.

Это незначительно влияет на скорость (будет иметь значение только в том случае, если искомый текст массивный) и на регулярные выражения, которые выполняются с индексом startAt (поиск в начале строки, чем startAt, а не позже в строка).

Примеры; будем надеяться, что браузеры не слишком запутают это:

string saying = "למכות is in כתר"; //Just because it amuses me that this is a saying whatever way round the browser puts malkuth and kether.
string kether = "כתר";
Console.WriteLine(new Regex(kether, RegexOptions.RightToLeft).IsMatch(saying));//True
Console.WriteLine(new Regex(kether, RegexOptions.None).IsMatch(saying));//True, perhaps minutely faster but so little that noise would hide it.
Console.WriteLine(new Regex(kether, RegexOptions.RightToLeft).IsMatch(saying, 2));//False
Console.WriteLine(new Regex(kether, RegexOptions.None).IsMatch(saying, 2));//True
//And to show that the ordering is codepoint rather than physical display ordering:
Console.WriteLine(new Regex("" + kether[0] + ".*" + kether[2]).IsMatch(saying));//True
Console.WriteLine(new Regex("" + kether[2] + ".*" + kether[0]).IsMatch(saying));//False
...