2010-08-17 9 views
11

In Javascript möchte ich Strings, die mit einer bestimmten Phrase beginnen, übereinstimmen. Ich möchte jedoch, dass es in der Lage ist, den Anfang jedes Wortes in der Phrase zu finden, nicht nur den Anfang der Phrase.Regex-Übereinstimmung für den Anfang mehrerer Wörter in Zeichenfolge

Zum Beispiel:

Phrase: "Dies ist das beste"

Need an Spiel: "th"

Ergebnis: Spiele Th und th

EDIT: \ b funktioniert super es schlägt jedoch ein anderes Problem vor:

Es wird auch Zeichen nach ausländischen übereinstimmen. Zum Beispiel, wenn meine Zeichenfolge "Männ" ist, und ich nach "n" suche, wird es dem n nach Mä ... entsprechen. Irgendwelche Ideen?

Antwort

23
"This is the best moth".match(/\bth/gi); 

oder mit einer Variablen für die Zeichenfolge

var string = "This is the best moth"; 
alert(string.match(/\bth/gi)); 

\b in einem regex ist eine Wortgrenze so \bth nur einen th übereinstimmen, die am Anfang eines Wortes.

gi ist für ein globales Spiel (suchen Sie nach allen Vorkommen) und Groß- und Kleinschreibung

(ich als Erinnerung moth dort warf, dass es nicht abgestimmt zu überprüfen)

jsFiddle example


Edit:

Also, die ein bove gibt nur den Teil zurück, den Sie gefunden haben (th). Wenn Sie die gesamten Wörter zurückgeben möchten, müssen Sie das gesamte Wort übereinstimmen.

Hier wird es schnell knifflig. Zunächst ohne HTML-Entität Brief:

string.match(/\bth[^\b]*?\b/gi); 

Example

Um das ganze Wort aus dem Wortgrenze \b greift die th gefolgt von Nichtwortgrenzen [^\b] geht übereinstimmen, bis Sie an einem anderen Wortgrenze \b bekommen. Die * bedeutet, dass Sie nach 0 oder mehr der vorherigen (nicht Wort Grenzen) Suche nach ? Mark bedeutet, dass dies eine träge Übereinstimmung ist. Mit anderen Worten, es wird nicht so groß, wie es möglich wäre, sondern es stoppt bei der ersten Gelegenheit.

Wenn Sie HTML-Entity-Zeichen wie ä (ä) haben, werden die Dinge wirklich schnell kompliziert, und Sie müssen Whitespace oder Whitespace und eine Reihe von definierten Zeichen verwenden, die an Wortgrenzen liegen.

string.match(/\sth[^\s]*|^th[^\s]*/gi); 

Example with HTML entities.

Da wir nicht Wortgrenzen verwenden, müssen wir kümmern uns um den Anfang des Strings separat nehmen (|^).

Oben wird der Leerraum am Anfang der Wörter erfasst. Mit \b wird kein Leerraum erfasst, da \b keine Breite hat.

+4

+1 danke für die Einführung mich zu \ b :) –

+0

@Michael - YW! Dies ist eine gute Referenz für Regex - http://www.regular-expressions.info/reference.html –

+0

Das funktioniert gut, außer dass es auch Zeichen nach fremden übereinstimmen wird. Zum Beispiel, wenn meine Zeichenfolge "Männ" ist, und ich nach "n" suche, wird es dem n nach Mä ... entsprechen. Irgendwelche Ideen? – Abadaba

1

Verwenden Sie diese:

string.match(/^th|\sth/gi); 

Beispiele:

'is this is a string'.match(/^th|\sth/gi); 


'the string: This is a string'.match(/^th|\sth/gi); 

Ergebnisse:

[ "th", "Th"]

[ "th"]

+1

Da op "irgendein Wort" erwähnt, kann es nicht sicher sein, einen Platz für eine Wortgrenze anzunehmen. Deine Regex passt zu nichts in "Hier ist der Satz!". Deshalb ist '\ b' besser als Wortgrenze. –

1
var matches = "This is the best".match(/\bth/ig); 

kehrt:

["Th", "th"] 

Der reguläre Ausdruck bedeutet: Match "th" Fall zu ignorieren und global (Bedeutung, nicht aufhören nur ein Spiel auf), wenn "th" in der das erste Wort string oder wenn "th" ein Leerzeichen vorangestellt ist.

+0

Da op "irgendein Wort" erwähnt, kann es nicht sicher sein, einen Platz für eine Wortgrenze anzunehmen. Deine Regex passt zu nichts in "Hier ist der Satz!". Deshalb ist '\ b' besser als Wortgrenze. –

+0

@Peter Danke! Wusste nicht über '\ b'! –

+0

@Vivn - Ihr Beispiel entspricht immer noch "Th" wegen des Zeilenbeginns '^'. Eine globale Suche nach dem Anfang einer Zeile in einem String gibt immer noch 1 find zurück;) - http://jsfiddle.net/NHcLx/ –

1

Verwenden Sie das Flag g im Regex. Es steht für "global", denke ich, und es sucht nach alle Übereinstimmungen statt nur der ersten.

Sie sollten auch das i Flag für die Groß- und Kleinschreibung beachten.

Sie fügen Fahnen bis zum Ende der Regex (/<regex>/<flags>) oder als zweiten Parameter an new RegExp(pattern, flags)

Zum Beispiel:

var matches = "This is the best".match(/\bth/gi); 

oder unter Verwendung RegExp Objekte:

var re = new RegExp("\\bth", "gi"); 
var matches = re.exec("This is the best"); 

EDIT: Verwenden Sie \b in der Regex t o passen Sie die b Grenze eines Wortes. Beachten Sie, dass es nicht wirklich mit einem bestimmten Zeichen übereinstimmt, sondern mit dem Anfang oder Ende eines Wortes oder der Zeichenfolge.

+0

Aber das wird zwischen Wörtern in der Zeichenfolge suchen, die ich nicht will – Abadaba

+0

Dies wird auch 'Moth' in der Zeichenfolge übereinstimmen. –

+0

Dies entspricht allen Vorkommen von "th", unabhängig davon, ob sie am Anfang eines Wortes stehen oder nicht. –

Verwandte Themen