2016-03-08 8 views
3

Мне нужна помощь в регулярном выражении. В последние несколько часов я стучал головой. Мне нужно сопоставить некоторые строки в мини-файле.Соответствующий текст между двойными или одинарными кавычками

Пример строки:

var a ='abc'; var b = 'http://a/that.dude.js/v1/'; var c = 'def'; var d = 'https://b/that.dude.js/v1/'; 
var basePath = "http://othersite/that.dude.js/v1/"; 

Я хочу, чтобы соответствовать полный текст внутри одинарные или двойные кавычки, которая содержит that.dude.js/v1. Я пробовал:

/('|").+that.dude.js\/v1\/('|")/g 

... но это соответствует полной линии при наличии нескольких вхождений в одной и той же линии.

Мой ожидаемый матч будет:

http://a/that.dude.js/v1/ 
https://b/that.dude.js/v1/ 
http://othersite/that.dude.js/v1/ 

Вот что я пробовал: http://regexr.com/3cv62

+0

['(['"]) (. *? That \ .dude. *?) \ 1'] (https://regex101.com/r/rN4dK5/1)? – Tushar

ответ

2

Если у вас есть одиночные кавычки внутри строк в двойных кавычках, вам нужно захватить кавычки разделителя и использовать обратную ссылку, чтобы соответствовать точно такой же косой разделитель:

(['"])([^"'\s]*that\.dude\.js\/v1[^"'\s]*)\1 

См regex demo.

Поскольку у вас есть URL-адреса, вы можете смело сопоставить их с [^"'\s]* (один или несколько символов, кроме , ' и пробелы). Регулярное выражение совпадений:

  • (['"]) - ведущая цитата разделителем (захватывается в 1-й группе, чтобы мы могли соответствовать один и тот же замыкающий разделитель)
  • ([^"'\s]*that\.dude\.js\/v1[^"'\s]*) - Группа 2 соответствия
    • [^"'\s]* - 0+ другие символы чем ", ' и пробельных
    • that\.dude\.js\/v1 - that.dude.js/v1
    • [^"'\s]* - там же.
  • \1 - Продольный разделитель, который является таким же, как ведущий один

Результат будет в группе 2:

var re = /(['"])([^"'\s]*that\.dude\.js\/v1[^"'\s]*)\1/g; 
 
var str = 'var a =\'abc\'; var b = \'http://a/that.dude.js/v1/\'; var c = \'def\'; var d = \'https://b/that.dude.js/v1/\';\nvar basePath = "http://othersite/that.dude.js/v1/";'; 
 
var res = []; 
 
    
 
while ((m = re.exec(str)) !== null) { 
 
    res.push(m[2]); 
 
} 
 
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>";

Обратите внимание, что, чтобы сделать его еще более общий, вы можете использовать закаленный жадный токен :

(['"])((?:(?!\1).)*that\.dude\.js\/v1(?:(?!\1).)*)\1 
     ^^^^^^^^^^^^     ^^^^^^^^^^^^ 

См another demo

(?:(?!\1).) маркер будет соответствовать любой символ (ы), но символ новой строки, которые не равно значению, на которое ссылается \1 обратной ссылки.

+0

извините, я не упомянул один случай использования для соответствия var basePath = "that.dude.js/v1 /"; var basePath = 'that.dude.js/v1 /'; – KhanSharp

+0

Не соответствует ли это [https://regex101.com/r/kW1wA3/1)? –

+1

да он делает. спасибо – KhanSharp

2

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

/(["'])[^"']+that\.dude\.js\/v1\/\1/g 

Единственное изменение заключается в изменении . в [^"'] этой не допускает котировки между кавычками.

+0

Что делать, если двойная кавычка " значение "содержит' '' внутри? –

+0

, так как это URL-адрес, это не так. – Adam

+0

Если это URL-адрес, вы можете просто использовать '\ S': [' (['"]) (\ S * that \ .dude \ .js \/v1 \ S *) \ 1 '] (https://regex101.com/r/gQ4sD0/2). Обратите внимание, что не рекомендуется использовать группы чередования с одиночными символами. Класс персонажа намного чище и эффективнее. –

Смежные вопросы