Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.02.2013, 13:26
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Помощь с регуляркой
Чёто никак не могу допереть, допустим есть строка:
'return el == "bla-bla-bla this \"foo"'

И мне нужно понять, используется ли this в строке (считается, что если this указан внутри кавычек, то это строка).

Как делаю сейчас: в цикле бегу по символьно по строке, если внутри строки объявляется "подстрока", то все нужные для меня символы внутри неё заменяю на временные константы, а ля __ESCAPE_THIS__, а уже после этого делаю нужные мне действия и после проделанной работы заменяю константы на их истинные значения.

Мне не очень нравится такой подход, хочется написать регурялку, но никак не могу допереть, уже неск дней голову ломаю, а казалось такая ерунда.

Сухой остаток: нужно написать регулярку, которая в строке
'return el == "bla-bla-bla this \"foo"'
определит присутствие (или отсутствие) слова this, с условием, что если слово взято в кавычки, то оно не подходит.

Заранее благодарен
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 10.02.2013 в 13:29.
Ответить с цитированием
  #2 (permalink)  
Старый 10.02.2013, 13:32
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Обратное - наличие this в кавычках
alert('return el == " this "' .split(/(["']\s*this\s*["'])/)[1])

Последний раз редактировалось Deff, 10.02.2013 в 13:34.
Ответить с цитированием
  #3 (permalink)  
Старый 10.02.2013, 13:34
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от Deff Посмотреть сообщение
alert('return el == " this "' .split(/(["']\s*this\s*["'])/)[1])
Не, это не подходит, т.к. не всё так просто Я бы не стал заводить темы если бы решение было бы совсем тривиальным.
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 10.02.2013 в 13:40.
Ответить с цитированием
  #4 (permalink)  
Старый 10.02.2013, 13:47
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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])}

Последний раз редактировалось Deff, 10.02.2013 в 13:52.
Ответить с цитированием
  #5 (permalink)  
Старый 10.02.2013, 13:52
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от Deff Посмотреть сообщение
kobezzza,
Смотришь наличие this, если да - отправляешь строку на проверку тhis в кавычках

if('return el == " this "' .split(/(this)/)[1]=='this'){
alert('return el == " this "' .split(/(["']\s*this\s*["'])/)[1])

}
Из этой задумки можно родить алгоритм, но он гораздо избыточней и неудобней, чем мой вариант с циклом (т.к. помимо того же this нужна так кучу вещей проверять).

Уточню вопрос: как решить задачу лишь одними регулярками (одной или несколькими). Сама задача у меня уже давно решена, но меня интересует именно решение регулярками.

ЗЫ: твоя регулярка не учитывает кучу параметров, таких как синхронизация кавычек, обработка экранированных кавычек, учитывание, что this может являться частью другого слова, и что в строке может быть любой набор символов, пример из первого поста:
'return el == "bla-bla-bla this \"foo"'
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 10.02.2013 в 13:57.
Ответить с цитированием
  #6 (permalink)  
Старый 10.02.2013, 13:57
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

alert('return el == " this "' .replace(/((?:["']\s*)?this(?:["']\s*)?)/i,'$1') == 'this')

alert('return el == this ' .replace(/((?:["']\s*)(?=this(?:["']\s*)?))/i,'$1') == 'this')
Ответить с цитированием
  #7 (permalink)  
Старый 10.02.2013, 13:59
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от Deff Посмотреть сообщение
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
__________________
kobezzza
code monkey
Ответить с цитированием
  #8 (permalink)  
Старый 10.02.2013, 14:00
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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))

Последний раз редактировалось Deff, 10.02.2013 в 14:18.
Ответить с цитированием
  #9 (permalink)  
Старый 10.02.2013, 14:16
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Опять мимо
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
code monkey

Последний раз редактировалось kobezzza, 10.02.2013 в 14:19.
Ответить с цитированием
  #10 (permalink)  
Старый 10.02.2013, 14:23
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

kobezzza,
Мучаешь - я тут от дел лыню,...
Идея реализуемо, но имхо длинотельна
Вместо пробелов дважды проверять на некавчки
["][^"]*?this[^"]*?["]
['][^']*?this[^']*?[']
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бесплатная помощь новичкам iCanary Общие вопросы Javascript 11 30.11.2015 19:35
нужна помощь в JavaScript михаил Общие вопросы Javascript 26 30.10.2013 10:07
Помощь в настройке слайдера tatiana-js Работа 1 06.01.2012 15:53
нужна помощь dominosoko Серверные языки и технологии 4 14.03.2010 01:17