2016-03-24 14 views
1

Bir giriş dizem var, diyelim ki potato. Visual Studio'da büyük bir projem var. Iki karakterden daha uzun girdi herhangi bir alt dize bulmak için bir regex yazmaya çalışıyorum. vb Örneğin, pot, ato, tat,Verilen bir dizgeden iki karakterden daha uzun olan herhangi bir alt dize ile eşleşen Regex düzeni

/([p,o,t,a]){2,10}/g

için bu uzun bu mektupları içeren iki ve 10 karakter arasında herhangi bir dize bulur fakat düzene dikkate almamaktadır. Ben etkili

/([potato]){2,10}/g

yapmak isteyen ve sağlanan dizede bulunan sadece alt dizeleri döndürür var ediyorum. Bu mümkün mü? Verilen örnek için

+0

İlk . Bu durumda 6. –

+0

Belki de özyinelemeli olarak örn. eğer [i] ile işlenirse, s [i + 1] ile arayın? –

+0

Giriş kaynağı nedir? Kullanıcı? Ve kullanıcı girilen dizgenin alt dizesini nerede arar? –

cevap

1

iş yapacağını bu regex: Bu iç içe geçmiş OR (|) ifadesindeki tüm olası 3 karakterli alt dizeleri alır ve 'patates' sonraki tüm karakterleri ile eşleşen

(((pota?|ota)t?|tat)o?|ato) 

eğer mevcutlarsa (isteğe bağlı).

Bu ifadede, kullanıcı tarafından sağlanan herhangi bir arama öğesinden dinamik olarak oluşturulabilmesi için yinelenebilir bir mantık vardır.

Bunu göstermek için, burada yalnızca bunu yapan canlı bir JavaScript snippet'i var. Bir arama dizesi ve aranacak metni girmenizi sağlar. Daha sonra düzenli ifadeyi çıkarır ve eşleştirilen metin parçalarını vurgulayarak uygular.

düzenli ifadeleri destekleyen başka bir dile tercüme etmek kolay olacaktır:

// Core function 
 
function buildRegexFor(find) { 
 
    var regexStr = find.substr(0,3); 
 
    for (var i = 1; i < find.length - 2; i++) { 
 
     regexStr = '(' + regexStr + find.substr(i+2,1) + '?|' + find.substr(i,3) + ')'; 
 
    } 
 
    return regexStr; 
 
} 
 

 
// Handle button click event 
 
document.querySelector('button').onclick = function() { 
 
    // (1) read input 
 
    var find = document.querySelector('input').value; 
 
    var str = document.querySelector('textarea').value; 
 

 
    // (2) build regular expression using above function 
 
    var regexStr = buildRegexFor(find); 
 
    
 
    // (3) apply regular expression to text and highlight all found instances 
 
    str = str.replace(new RegExp(regexStr, 'g'), "<b>$1</b>"); 
 
    
 
    // (4) output 
 
    document.querySelector('span').textContent = regexStr; 
 
    document.querySelector('div').innerHTML = str; 
 
};
b { background: yellow }
Value to find:<br> 
 
<input value="potato"><br> 
 
<button>find</button><br> 
 
Text to find in:<br> 
 
<textarea cols=40>There is a spot in the botanic garden 
 
on this atol that beats all stats as it rotates potatoes.</textarea><br> 
 
Regex: <span></span><br> 
 
<div></div>
sonra maksimum uzunluğu alt dize arıyor tüm eğer dize uzunluğu olmalıdır ait

+0

Bu soruya cevap verdin mi? Bir yorum bırakabilir misiniz? – trincot

+1

Teşekkürler trincot! – Kup

İlgili konular