Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помощь с регуляркой (https://javascript.ru/forum/misc/35409-pomoshh-s-regulyarkojj.html)

kobezzza 10.02.2013 15:26

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

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

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

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

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

Заранее благодарен:)

Deff 10.02.2013 15:32

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

kobezzza 10.02.2013 15:34

Цитата:

Сообщение от Deff (Сообщение 232868)
alert('return el == " this "' .split(/(["']\s*this\s*["'])/)[1])

Не, это не подходит, т.к. не всё так просто:) Я бы не стал заводить темы если бы решение было бы совсем тривиальным.

Deff 10.02.2013 15:47

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

kobezzza 10.02.2013 15:52

Цитата:

Сообщение от Deff (Сообщение 232871)
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"'

Deff 10.02.2013 15:57

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

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

kobezzza 10.02.2013 15:59

Цитата:

Сообщение от Deff (Сообщение 232875)
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

Deff 10.02.2013 16:00

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

kobezzza 10.02.2013 16:16

Опять мимо :)
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 в кавычках ничего нет. В кавычках может быть любой набор символов, т.к. это простая строка.

Deff 10.02.2013 16:23

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


Часовой пояс GMT +3, время: 04:09.