2015-05-12 5 views
0

Каков наилучший способ совместить две строки, содержащие одну и ту же фразу? Например есть хороший способ, чтобы соответствовать следующим две строки:соответствие строк в javascript/regex

st1 = 'jenissplendidicecreams' 
st2 = 'jenisicecream' 

Что бы правильное регулярное выражение, чтобы соответствовать эти две строки?

+2

что вы пытаетесь соответствовать? вы пытаетесь проверить, есть ли конкретная строка в обоих этих? (например, проверка, чтобы увидеть, содержат ли в обеих строках «jenis»? –

+0

да, но без использования .substring или .slice - есть ли альтернатива регулярного выражения? –

+0

Если это имеет лимит? это может занять очень много времени для длинных строк ... – RobertoNovelo

ответ

2

Вы должны построить регулярное выражение, которое выглядит следующим образом:

/.*j.*e.*n.*i.*s.*i.*c.*e.*c.*r.*e.*a.*m.*/ 

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

Мы можем построить что достаточно легко, делая

function make_regexp(str) { 
    var letters = str.split(''); 
    letters.push(''), letters.unshift(''); 
    return new RegExp(letters.join('.*')); 
} 

> make_regexp('jenisicecream') 
< /.*j.*e.*n.*i.*s.*i.*c.*e.*c.*r.*e.*a.*m.*/ 

Теперь проверьте, если вторая строка соответствует:

> make_regexp('jenisicecream').test('jenissplendidicecreams') 
< true 
+0

Но это поддерживает такие вещи, как: 'make_regexp ('jenisicecream'). Test ('ajaeanaiasasapalaeanadaiadaiacaeacaraeaaamas') -> true' – Downgoat

+0

Да, это так. Но этот пример удовлетворяет определению OP «двух строк, содержащих одну и ту же фразу», если только он не хочет уточнить свое определение, включить такие условия, как «... ту же самую фразу с минимальной длиной x» или «.. . Такие же фразы до максимума у ​​". –

+0

Или «та же фраза в самом начале». –

0

Много способов сделать это.

Вы можете просто использовать методы струнные:

var name = st1.slice(0, st1.indexOf("splendidicecream")); 

return name == st2.slice(0, st2.indexOf("icecream")); 

Или, если вы действительно хотите использовать регулярное выражение:

var nameRe = /.+?(?=splendidicecream)/, 
    name = st1.match(nameRe)[0]; 

return st2.startsWith(name); 

Или сложнее регулярное выражение:

var nameRe = /.+?(?=splendidicecream)/, 
    startsWithNameRe = new RegExp("^" + st1.match(nameRe)[0]); 

return startsWithNameRe.test(st2); 
+0

Что делать, если значение re должно быть динамическим? Например, могу ли я использовать подстроку для создания значения re? Например, могу ли я сделать - st1.slice (0, 5), чтобы сгенерировать значение re? –

+0

Является ли проблема, что вы пытаетесь решить, что хотите проверить, что оба начинаются с одной и той же строки?вы гарантированно, что строка - это определенная длина? –

+0

да, точно. но я не гарантирован, что они имеют определенную длину. –

0

Проблема заключается в том, что компьютеры не знаю, где слова. Либо вы могли бы индексировать весь словарь или использовать что-то, что использует заданное расстояние, чтобы получить значения (если string является str2 и str является str1):

var distance = 8, // Best for your current case 
    end  = new RegExp('.{'+distance+'}$', '').exec(string)[0], 
    start = new RegExp('^(.*)'+end+'$', '').exec(string)[1]; 

function matches (s) { 
    return new RegExp('^(?:'+start+').*(?:'+end+')$').test(s); 
} 

matches(str); 


Или вы можете иметь компьютерную догадку :

var min = 1, // Adjust depending on acceptance level 
    split = string.split('').reverse().map(function (a,i) { 
     if ((i+1) % min === 0) { 
      return a + '.*'; 
     } else { 
      return a; 
     } 
    }).reverse().join(''), 
    regex = new RegExp(split, ''); 

regex.test('jenissplendidicecreams'); 
1

Я не совсем уверен, но я думаю, что вы могли бы искать что-то вроде этого ?

var str1 = "I have some words!"; 
 
var str2 = "I have some very similar words!"; 
 

 
var min = 5; 
 
var max = 6; 
 

 
var len = str1.length; 
 

 
for(var i = 0; i<len; i++) 
 
{ 
 
    for(var j = min; j<max; j++) 
 
    { 
 
    var re = new RegExp(str1.substring(i,j)); 
 
    console.log(re); 
 

 
    //Do something when this returns true?? 
 
    console.log(re.test(str2)); 
 
    } 
 
}