2013-11-07 3 views
1

Простите за ужасное название - не знаете, как лучше всего его поместить.Сопоставьте строку в строке, содержащей определенную строку в Javascript

примечание: Am пытается сделать это в Javascript

Я хочу, чтобы соответствовать определенному тексту в 2-х разных адресах, которые имеют различную длину и структуру. Один начинается с video, а другой - с audio. Соответствие должно быть заменено по-разному в зависимости от начала строки.

Я не могу решить, как сделать dotall (. *) Совпадение в положительном lookbehind?

Например, приведенные ниже строки должны быть согласованы на 2 отдельных RegEx-х лет, один указав, что video и другой audio должен быть перед %7bmatch%7d Они должны только матча %7bmatch%7d для данной строки начинаются.

video://[email protected]#[email protected]/%7bmatch%7d/[email protected]#[email protected] 

audio://[email protected]#[email protected]/%7bmatch%7d/[email protected]#[email protected] 

Я пробовал: /(?<=video)(?<=.*)%7bmatch%7d/ghttp://regexr.com?373gh среди других вариантов и не совсем, кажется, только соответствовать %7bmatch%7d или любой другой матч, не получая все так video в примере. Попал в тупик, по-настоящему оценил бы толчок в правильном направлении.

EDIT: Ответ специфичен для Javascript:

// Random collection of string(s) 
var inputString = "video://[email protected]/asd/ft#[email protected]/%7bmatch%7d/[email protected]#[email protected]://[email protected]#Rsinbet/asdfas/[email protected]/%7bmatch%7d/[email protected]#[email protected]://[email protected]#Rsinbetweasdf/asd/f/[email protected]/%7bmatch%7d/[email protected]#[email protected]://[email protected]#[email protected]/%7bmatch%7d/[email protected]#[email protected]://[email protected]#[email protected]/%7bmatch%7d/[email protected]#[email protected]://[email protected]///asdfasdfct#[email protected]/%7bmatch%7d/[email protected]#[email protected]"; 



// Regex to match after every `video` occurence 
regexVideo = new RegExp(/(video.*?)%7bmatch%7d/g); 

// Regex to match after every `audio` occurence 
regexAudio = new RegExp(/(audio.*?)%7bmatch%7d/g); 

// strings to replace the matches 
var replaceStringVideo = "<span class='woot'>W00tW00tVideoW00t</span>"; 
var replaceStringAudio = "<span class='woot'>W00tW00tVAudioW00t</span>"; 

// replace both audio and video with respective replace values NOTE: the dollar token needed concatenated before the replaceString. 
inputString.replace(regexVideo, "$1" + replaceStringVideo).replace(regexAudio, "$1" + replaceStringAudio); 

// This yields an inputString value of 
"video://[email protected]/asd/ft#[email protected]/<span class='woot'>W00tW00tVideoW00t</span>/[email protected]#[email protected]://[email protected]#Rsinbet/asdfas/[email protected]/<span class='woot'>W00tW00tVAudioW00t</span>/[email protected]#[email protected]://[email protected]#Rsinbetweasdf/asd/f/[email protected]/<span class='woot'>W00tW00tVideoW00t</span>/[email protected]#[email protected]://[email protected]#[email protected]/<span class='woot'>W00tW00tVAudioW00t</span>/[email protected]#[email protected]://[email protected]#[email protected]/<span class='woot'>W00tW00tVideoW00t</span>/[email protected]#[email protected]://[email protected]///asdfasdfct#[email protected]/<span class='woot'>W00tW00tVAudioW00t</span>/[email protected]#[email protected]" 
+0

Какого языка или инструмент вы используете? –

+0

Будет использовать javascript, если я могу заставить его работать на regexr.com –

+0

Его не работает в regexr, потому что он, похоже, не поддерживает переменную длину lookbehinds. Если вы измените. * На. {X}, где x - точное число символов, которое оно будет соответствовать. – OGHaza

ответ

1

Похоже, ошибка на этом сайте. Вы должны использовать /(?<=video.*)%7b.*?%7d/g, но этот веб-сайт, похоже, считает, что это взгляд, а не lookbehind (вы можете проверить его, зависая над скобками).


Если вам нужно соответствовать %7b.*?%7d, чтобы заменить его, просто сопрягать все к нему и относятся к тому, что в вашей замены, как это:

s/^(video.*?)%7b.*?%7d/$1your_replacement_here/g

См demo on regexr.com и другой demo on regex101.com.

+0

JS не поддерживает lookbehinds. И большинство двигателей даже не поддерживают бесконечные искажения, как вы предлагаете. – HamZa

+0

@SQB У сайта есть свои tootltips muddled. Я согласен, однако, примеры lookahead/lookbehind работают так, как ожидалось, только подсказки неверны. –

+0

Да, только сейчас увидел, что аська хочет использовать JavaScript. И пример выглядел в нем, поэтому я предположил, что это на диалекте, который поддерживает lookbehinds. – SQB

2

Если вы используете PHP или Perl, то вы можете использовать \K якорь, чтобы игнорировать все согласованное перед ним в регулярном выражении, как это:

video.*\K%7bmatch%7 

В JavaScript, к сожалению, самым простым способом было бы использовать следующее регулярное выражение, которое соответствовало бы всем вещам от видео до %7bmatch%7d, тогда вы можете использовать replace() избавиться от оон необходимых данных:

var input = "video://[email protected]#[email protected]/%7bmatch%7d/[email protected]#[email protected]"; 
var finalResult = /(?=video.*%7bmatch%7d).*%7bmatch%7d/.exec(input)[0].replace(/.*(?=%7bmatch%7d)/, ""); 
console.log(finalResult); 

Regex101 Demo

+0

большое спасибо. Похоже, что это работает на http://regexr.com?373gq –

+0

@RobSchmuecker. Добро пожаловать, но будьте осторожны, чтобы JavaScript не поддерживал якорь '\ K' и не заглядывал. –

+0

ah Я только что заметил, что - какие-нибудь подсказки о том, как заставить его работать в JS? –

0

Что об этом RegExp:

var regExpVideo = /(?:video):\/\/[^%]+([^\/]+)/ 
var regExpAudio = /(?:audio):\/\/[^%]+([^\/]+)/ 
var videoSource = regExpVideo.exec("video://[email protected]#[email protected]/%7bmatch%7d/[email protected]#[email protected]")[1]; 
var audioSource = regExpAudio.exec("audio://[email protected]#[email protected]/%7bmatch%7d/[email protected]#[email protected]")[1]; 

Надеется, что это помогает,

С уважением,

Марсело

+0

Привет, Mindastic, много thansk для вашего ответа, вот почему я принимаю ответ @ SQB http://jsfiddle.net/robschmuecker/zHQAZ/embedded/result/ –

+0

Привет, Роб. Я просто обновил свой ответ, потому что, когда я его написал, я хотел использовать exec вместо соответствия. Я не знаю, почему я использовал совпадение, потому что соответствие для строк не для regexp. Во всяком случае, я рад прочитать, что вы получите полезный ответ :). Rgds. – Mindastic