2017-09-27 2 views
0

/\Bon/ passt "on" in "um Mittag" und /ye\B/ passt "ye" in "möglicherweise gestern". Warum passiert das? B funktioniert nicht wie erwartet in Regex

Wie Nach den folgenden Fragen https://stackoverflow.com/a/6664167/6575810

Wie es heißt

\B ist eine Null-Breite Nicht-Wortgrenze. Im Einzelnen:

Spiele an der Position zwischen zwei Wortzeichen (d.h. die Position zwischen \w\w) sowie an der Position zwischen zwei nicht-Wort Zeichen (d.h. \W\W).

Es sollte nicht. Fehle ich hier irgendetwas?

Siehe auch meinen Kommentar auf trott Antwort- https://stackoverflow.com/a/46439352/6575810

Antwort

1

/\Bon/ matches "auf" in "mittags" und /ye\B/ matches "ye" in "möglicherweise gestern". Warum passiert das?

, dass die richtige und erwartete Verhalten ist:

console.log("at noon".match(/\Bon/)[0]); 
 
console.log("possibly yesterday".match(/ye\B/)[0]);

Im Gegensatz zu Zeichenklassen wie \w, die einen einzelnen "word" character übereinstimmen oder \s, die einen einzelnen Raumzeichen übereinstimmt, ist \Banchor point es passt nicht zu einem Zeichen, sondern behauptet, dass sich dieser Anker an einer bestimmten Stelle befindet. Im Fall von \B behauptet es, dass dieser Anker nicht an einer Wortgrenze ist.

Eine Wortgrenze wäre entweder eine Stelle, an der "word character" neben einem Leerzeichen steht, oder der Anfang oder das Ende der Zeichenfolge.

Also, /\Bon/ bedeutet effektiv finden Sie ein "on", die nicht am Anfang eines Wortes ist.Deshalb stimmt das "on" in "no on" überein; aber so etwas wie die „on“ in „an einem“ nicht:

console.log("at one".match(/\Bon/));

In gleicher Weise /ye\B/ bedeutet effektiv eine „ye“ finden, die nicht am Ende eines Wortes . Also, die „sie“ in „möglicherweise ihr sterday“ paßt, weil es nicht am Ende des Wortes ist, während die „sie“ am Ende von „möglicherweise goodbye“ nicht:

console.log("possibly goodbye".match(/ye\B/));

Es sollte auch hinzugefügt werden, dass \B nicht mit \b verwechselt werden sollte, haben sie unterschiedliche Bedeutungen. \b entspricht einem Ankerpunkt an einer Wortgrenze. Also, wenn Sie ein Wort finden wollen, die mit „auf“ könnte man /\bon/ verwenden:

console.log("one at noon".match(/\bon/)); // finds the "on" in one, but not the "on" in noon

Ebenso kann es etwas am Ende eines Wortes finden verwendet werden:

console.log("goodbye yesterday".match(/ye\b/)); // finds the "ye" in goodbye, but not the "ye" in yesterday

3

Dieses Verhalten scheint richtig. Klingt, als ob Sie \b für Wortgrenzen möchten.

/\Bon/.test('at noon'); // true 
/\bon/.test('at noon'); // false 

In der ersten Zeile, \B ist eine nicht-Wortgrenze. Mit anderen Worten, es ist eine Grenze, wo sowohl das Ding davor als auch das Ding danach entweder Teil desselben Wortes oder Teil desselben Nicht-Wortes sind (wie zwei Räume nebeneinander).

In der zweiten Zeile muss \b eine Wortgrenze sein, damit die Regex übereinstimmt. Es stimmt nicht überein, weil es in der Mitte eines Wortes auftritt.

+0

wie das Ding funktioniert, bevor „auf“ das ist o und Sache nach „auf“ das ist nichts. ist ein Teil des gleichen Wortes? –

+0

@AnkurMarwaha Ich bin nicht sicher, was Sie fragen ... aber versuchen, die Dinge für Sie aufzuräumen, in diesem Beispiel gibt es zwei Wörter, "at" und "Mittag". Das "An" ist Teil des Wortes "Mittag". Die Wortgrenzen liegen vor dem ersten "n" und nach dem letzten "n". Die Nicht-Wort-Grenzen würden zwischen dem ersten "n" und dem ersten "o" liegen, zwischen diesem "o" und dem nächsten "o" und dann zwischen diesem und dem letzten "n". '/ \ Bon /' stimmt mit der Nicht-Wort-Grenze zwischen den 2 "o" s und dann mit dem "on" überein. '\ B' ist ein Anker mit der Breite Null, was bedeutet, dass bei der Übereinstimmung nichts zu der zurückgegebenen Übereinstimmungszeichenfolge hinzugefügt wird. –

Verwandte Themen