Actionscript, использующий \ Q, чтобы игнорировать спец. Получать странные результаты - PullRequest
2 голосов
/ 30 июня 2011

спасибо за чтение моего вопроса.

Я использую объект RegExp в actionscript, чтобы просто проверить наличие одной строки внутри другой. Иногда строки могут содержать специальные символы RegEx, т.е. "*".

Чтобы справиться с этим, я связал \ Q с началом строки поиска, вот так ...

(String(reportItem[attributeToSearch])).search(new RegExp(("\Q" + searchText), "i"))

Это в настоящее время работает для больших строк и для строки "*". Однако я столкнулся с проблемой, когда искомая строка - это «снаряды с разрывным зарядом». Я ищу ", S", и это возвращает мне -1 в результате. Если я ищу ту же вещь без \ Q, она работает нормально, но тогда дело "*" прерывается.

Что дает?!

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 30 июня 2011

Вам нужно сбежать от \ в \Q

new RegExp(("\\Q" + searchText), "i");

Попробуйте это:

var regExp:RegExp;
regExp = new RegExp("\Qs,", "i");
trace(regExp.toString()); //    /Qs,/i

regExp = /\Qs,/i;               
trace(regExp.toString()); //    /\Qs,/i

regExp = new RegExp("\\Qs,", "i");
trace(regExp.toString()); //    /\Qs,/i
2 голосов
/ 30 июня 2011

Вы можете экранировать любые специальные символы в поиске пользователя, прежде чем включать его в регулярное выражение, используя код ниже. К сожалению, в flex нет встроенного способа избежать строки регулярного выражения.

private function escapeRegex(s:String):String {
   var result:String = s.replace(
      new RegExp("([{}\(\)\^$&.\*\?\/\+\|\[\\\\]|\]|\-)","g"), "\\$1");
   return result;
}

(Спасибо http://www.flexer.info/2008/08/07/how-to-escape-all-regexp-special-chars/)

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

РЕДАКТИРОВАТЬ: Как отметил Джейкоб, \ Q действительно работает, и это лучшее решение, чем избежать его вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...