2013-12-03 2 views
0

Я пытаюсь проверить, содержит ли строка хотя бы один символ (unicode) над кодовой точкой 0x7f (т. Е. Символ не-ascii).RegExp: проверьте хотя бы один символ (unicode) над кодовой точкой 0x7f

Я попытался следующие идеи (и некоторые другие), но они, кажется, не работает:

var rx:RegExp; 

rx = /[^\\x00-\\x7f]/; // negate ascii code point 0 to 127 
trace(rx.test('\u0080')); // true (expected true) 
trace(rx.test('b')); // true (expected false) 

rx = /[^\u0000-\u007f]/; // negate unicode code point 0 to 127 
trace(rx.test('\u0080')); // false (expected true) 
trace(rx.test('b')); // false (expected false) 

Может кто-нибудь помочь мне понять, почему это не работает, как ожидалось, и как это сделать это правильно?

+0

также ознакомьтесь с этим http://stackoverflow.com/questions/10414034/specifying-a-unicode-range-in-ans-actionscript-regular-expression. Мне было очень интересно. –

ответ

0

Я не уверен, что AS3 поддерживает unicode RegExp, например, Python. Я могу предложить следующее решение, которое поможет вам делать то, что вы хотите, но я уверен, что это медленный процесс для длинных строк.

function containsUnicode(text:String):Boolean 
{ 
    for (var i:int = text.length - 1; i >= 0; i--) 
    { 
     if (text.charCodeAt(i) > 127) 
      return true; 
    } 

    return false; 
} 
+0

Это достойная альтернатива, но на самом деле может быть медленной для длинных строк. Я думаю, что решил проблему. Посмотрев на другой вопрос, который вы предложили, я играл с разными диапазонами, и кажется, что '\ u0000' был виновником. Когда я меняю диапазон на '\ u0001- \ u007f', он работает так, как ожидалось. Возможно, '\ u0000' (символ' NUL') по умолчанию сохраняется в AS3-строках (под капотом или что-то еще. Я точно не знаю). –

+0

Я рад, что вы смогли решить свою проблему, было интересно узнать решение. Почему бы вам не опубликовать свой собственный ответ, чтобы помочь другим с похожим вопросом! –

1
/[^\\x00-\\x7f]/; 

Двойной обратный слеш означает буквального обратный слэш, так что вы ищете группу характеров, исключающей обратную косую черту, x, 0, все символы между 0 и обратной косой черты, x, 7 и f.

Вы использовали бы только двойные обратные косые черты, если регулярное выражение находилось в строковом литерале (как в new RegExp('[^\\x00-\\x7F]')); в значительной степени целая цель синтаксиса литерала регулярного выражения /.../ - позволить вам вводить выражения с обратным слэшем без дополнительного слоя экранирования.

'foo'.search(/[^\x00-\x7F]/)!==-1 // false 
'bär'.search(/[^\x00-\x7F]/)!==-1 // true 

Однако:

rx = /[^\u0000-\u007f]/; // negate unicode code point 0 to 127 
trace(rx.test('\u0080')); // false (expected true) 

true для меня в браузере JavaScript. Если нет в ActionScript, который, по-видимому, является несоответствующим ECMA ошибкой.

+0

Причина, по которой я использовал двойную обратную косую черту, потому что это [указано в документации] (http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ea5.html#d17e6915) (несколько раз). Все еще может быть опечатки с курса. Я нашел их странными. Однако, как [я упомянул в этом комментарии] (http://stackoverflow.com/questions/20341431/regexp-check-for-at-least-one-unicode-character-above-code-point-0x7f#comment30382559_20341691), похоже, ActionScript действительно имеет ошибку в этом отношении. Кажется, что ActionScript не похож на символ '\ u0000'. '\ x00' *. * работа хотя. –

+0

Ух! Это очень грустно (как ошибка, так и ошибка-ошибка). – bobince