Помощь с регуляркой
Чёто никак не могу допереть, допустим есть строка:
'return el == "bla-bla-bla this \"foo"' И мне нужно понять, используется ли this в строке (считается, что если this указан внутри кавычек, то это строка). Как делаю сейчас: в цикле бегу по символьно по строке, если внутри строки объявляется "подстрока", то все нужные для меня символы внутри неё заменяю на временные константы, а ля __ESCAPE_THIS__, а уже после этого делаю нужные мне действия и после проделанной работы заменяю константы на их истинные значения. Мне не очень нравится такой подход, хочется написать регурялку, но никак не могу допереть, уже неск дней голову ломаю, а казалось такая ерунда. Сухой остаток: нужно написать регулярку, которая в строке 'return el == "bla-bla-bla this \"foo"'определит присутствие (или отсутствие) слова this, с условием, что если слово взято в кавычки, то оно не подходит. Заранее благодарен:) |
Обратное - наличие this в кавычках
alert('return el == " this "' .split(/(["']\s*this\s*["'])/)[1])
|
Цитата:
|
kobezzza,
Смотришь наличие this, если да - отправляешь строку на проверку тhis в кавычках
if('return el ==this'.split(/(this)/)[1]=='this')
{alert('return el == this' .split(/(["']\s*this\s*["'])/)[1])}
if('return el =="this"'.split(/(this)/)[1]=='this')
{alert('return el == "this"' .split(/(["']\s*this\s*["'])/)[1])}
|
Цитата:
Уточню вопрос: как решить задачу лишь одними регулярками (одной или несколькими). Сама задача у меня уже давно решена, но меня интересует именно решение регулярками. ЗЫ: твоя регулярка не учитывает кучу параметров, таких как синхронизация кавычек, обработка экранированных кавычек, учитывание, что this может являться частью другого слова, и что в строке может быть любой набор символов, пример из первого поста: 'return el == "bla-bla-bla this \"foo"' |
alert('return el == " this "' .replace(/((?:["']\s*)?this(?:["']\s*)?)/i,'$1') == 'this')
alert('return el == this ' .replace(/((?:["']\s*)(?=this(?:["']\s*)?))/i,'$1') == 'this')
|
Цитата:
alert('return el == "bla-bla-bla this \"foo" && this' .replace(/((?:["']\s*)?this(?:["']\s*)?)/i,'$1') == 'this')
=> false, а должно быть true |
var str='return el == " this "'
function TstThis(str){
var a=str.replace(/^.*?((?:["']\s*)?this(?:["']\s*)?)/i,'$1').replace(/\s/ig,'');
return!(a.indexOf("'this'")!=-1||a.indexOf('"this"')!=-1)
}
var str='return el == " this "'
alert(TstThis(str))
var str='return el == this'
alert(TstThis(str))
var str='return el == "bla-bla-bla this \"foo" && this'
alert(TstThis(str))
|
Опять мимо :)
function TstThis(str){
var a=str.replace(/^.*?((?:["']\s*)?this(?:["']\s*)?)/i,'$1')
var b=a.replace(/\s/ig,'');
return!(b.indexOf("'this'")!=-1||b.indexOf('"this"')!=-1)
}
var str='return el == "bla-bla-bla this \"foo"'
alert(TstThis(str))
=> true, а должно быть false, т.к. this указан в кавычках, а реального this нет. ЗЫ: ты рассматриваешь самый элементарный случай, когда кроме this в кавычках ничего нет. В кавычках может быть любой набор символов, т.к. это простая строка. |
kobezzza,
:( Мучаешь - я тут от дел лыню,... Идея реализуемо, но имхо длинотельна Вместо пробелов дважды проверять на некавчки ["][^"]*?this[^"]*?["] ['][^']*?this[^']*?['] |
Цитата:
(["']).*?[^\\\1]\1- это регулярка вырезает содержимое строк, (вырезанной добавляем в специальный массив), затем делаем уже совсем простой поиск нужно и обратную замену, итого var a = 'return el == "fodfdf df \" \" dfdf" && this && "dfdsfdsfs"'.replace(/(["']).*?[^\\\1]\1/g, ''); alert(/\bthis\b/.test(a)) Спасибо за участие:) ЗЫ: и правда волшебный форум, неск дней не мог допереть, а тему создал так за 30 минут всё решил) |
есть еще ксать и такой вариант
\" this " \' this ' |
Цитата:
|
'fodfdf \"df dfdf "&& \" this * "this" '
|
Цитата:
var a = 'fodfdf \"df dfdf "&& \" this * "this" '.replace(/(["']).*?[^\\\1]\1/g, ''); alert(/\bthis\b/.test(a)) Всё ок, т.к. последний this указан без кавычек. Да и в моём случае, такая конструкция не валидна, т.к. у меня анализируется код функций JS, а там такой синтаксис упадёт:) PS: я пишу JIT компилятор для своего Collection, вот и извращаюсь) |
Цитата:
|
Цитата:
|
|
| Часовой пояс GMT +3, время: 23:50. |