2016-03-24 3 views
1

Ich habe eine Eingabezeichenfolge, sagen wir potato. Ich habe ein großes Projekt in Visual Studio. Ich versuche, eine Regex zu schreiben, um eine Teilzeichenfolge der Eingabe länger als zwei Zeichen zu finden. Zum Beispiel pot, ato, tat usw.Regex-Muster, um mit einer Teilzeichenkette übereinzustimmen, die länger als zwei Zeichen von einer bereitgestellten Zeichenfolge ist

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

Dies findet eine beliebige Zeichenfolge zwischen zwei und 10 Zeichen lang sein, diese Buchstaben enthalten, aber berücksichtigen weder den Auftrag. Ich bin auf der Suche effektiv

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

und habe es nur den Teil zurückkehren zu tun, die in dem mitgelieferten String gefunden werden. Ist das überhaupt möglich?

+0

Vor allem, wenn Sie für Teilzeichen dann maximale Länge suchen Länge dieser Zeichenfolge sein sollte . In diesem Fall 6. –

+0

Vielleicht durch Rekursion z.B. wenn es mit s [i] maschiert, dann ruf mit s [i + 1] an? –

+0

Was ist die Quelle der Eingabe? Benutzer ? Und wo sieht es nach einer Teilzeichenfolge der vom Benutzer eingegebenen Zeichenkette aus? –

Antwort

1

Für das gegebene Beispiel dieser Regex würde die Arbeit machen:

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

Diese alle möglichen Teilketten in einem verschachtelten OR (|) Ausdruck 3-Zeichen und entsprechen alle nachfolgenden Zeichen von ‚Kartoffel‘ nehmen wenn sie anwesend sind (optional).

Dieser Ausdruck enthält eine wiederholbare Logik, sodass er dynamisch aus jedem vom Benutzer bereitgestellten Suchelement erstellt werden kann.

Um dies zu demonstrieren, hier ist ein Live-JavaScript-Snippet, das genau das tut. Sie können einen Suchbegriff und den zu suchenden Text eingeben. Dann gibt es den regulären Ausdruck aus und wendet ihn an, wobei er die übereinstimmenden Textteile hervorhebt.

Es wird einfach sein, das zu einer anderen Sprache zu übersetzen, die reguläre Ausdrücke unterstützt:

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

+0

Hat dies Ihre Frage beantwortet? Könnten Sie einen Kommentar hinterlassen? – trincot

+1

Danke Trincot! – Kup

Verwandte Themen