2012-02-07 1 views
1

У меня есть несколько небольших меток, таких как 'א, א' 'א, ב'. Если мы используем запятую как центральную точку, мне нужно не более двух символов перед запятой и до следующего пробела после запятой.Lua pattern match около запятой

У меня есть (.-,.-)%s, но он не делает то, что мне нужно. Есть идеи?

Также, как вы можете видеть, там не латинские буквы, поэтому использование %l не будет работать.

ответ

2

Здесь пара проблем. Во-первых, незначительная проблема: .-, будет соответствовать как можно меньше до комы, то есть нулевые символы. Вы должны привязать начало согласованной строки.

Более сложная проблема заключается в том, что вы используете буквы на иврите. Проблема в том, что Lua has no concept многобайтовых символов.

Если вы используете 8-битную кодировку, такую ​​как Windows-1255 или ISO-8859-8, то вы, вероятно, можете просто сопоставить класс символов [ת-א]. Если вы правильно настроили языковой стандарт на иврите, %l должен отлично работать для вас.

Если вы используете UTF-8 или любую другую кодировку, которая использует многобайтовые символы, тогда вы должны создать регулярное выражение, в котором все еврейские алфавиты будут экранированы как последовательность октетов. Алеф U + 05D0x, который в UTF-8 будет представлен как 0xD7 0x90. Тав U + 05EA, который будет закодирован как 0xD7 0xAA.

В Lua вы можете избежать любого 8-битного символа с косой чертой + десятичный код. Все символы на иврите, закодированные в UTF-8, имеют первый байт - 0xD7, то есть "\215". Второй символ может быть от "\144" до "\170". Таким образом, регулярное выражение, которое будет соответствовать одному еврейскому письму, равно "\215[\144-\170]". Поместите это в свое исходное регулярное выражение, где у вас есть одиночные точки, соответствующие любому персонажу.

Конечно, приведенные выше рассуждения должны быть изменены для кодировок, отличных от UTF-8. Другое направление, на которое нужно обратить внимание на иврите, - это написание права налево.

+0

Это может быть моим лучшим выбором, спасибо. Но есть ли способ, которым я могу захватить 2 буквы за заданным персонажем? Например, если у меня было «abc, def», я хочу получить 2 буквы до того, что будет «bc». – cnotethegr8

+0

@ cnotethegr8: Сделайте себе одолжение и прочитайте [книгу совы] (http://www.amazon.com/Mastering-Regular-Expressions-Jeffrey-Friedl/dp/0596528124). –

+0

Хм, он не сказал, что идет над «Матчем матча» Луи. (Что отличается от Regex.) Я знаю, как это сделать с регулярным выражением, но Lua отличается от других. – cnotethegr8