Ich verwende Java-Regexes in Java 1.6 (um unter anderem die numerische Ausgabe zu analysieren) und kann keine genaue Definition von \b
("Wortgrenze") finden. Ich hatte angenommen, dass -12
dies ein "ganzzahliges Wort" wäre (übereinstimmend mit \b\-?\d+\b
), aber es scheint, dass dies nicht funktioniert. Ich wäre dankbar, wenn ich Möglichkeiten kennen würde, durch Leerzeichen getrennte Zahlen abzugleichen.
Beispiel:
Pattern pattern = Pattern.compile("\\s*\\b\\-?\\d+\\s*");
String plus = " 12 ";
System.out.println(""+pattern.matcher(plus).matches());
String minus = " -12 ";
System.out.println(""+pattern.matcher(minus).matches());
pattern = Pattern.compile("\\s*\\-?\\d+\\s*");
System.out.println(""+pattern.matcher(minus).matches());
Dies gibt zurück:
true
false
true
regex
word-boundary
peter.murray.rust
quelle
quelle
Antworten:
Eine Wortgrenze ist in den meisten Regex-Dialekten eine Position zwischen
\w
und\W
(Nicht-Wort-Zeichen) oder am Anfang oder Ende einer Zeichenfolge, wenn sie mit einem Wortzeichen ([0-9A-Za-z_]
) beginnt oder endet (bzw. endet ).In der Zeichenfolge
"-12"
würde es also vor der 1 oder nach der 2 übereinstimmen. Der Bindestrich ist kein Wortzeichen.quelle
\b
ist eine Behauptung mit einer Breite von Null, die übereinstimmt, wenn sie sich\w
auf einer Seite befindet und entweder\W
auf der anderen oder wenn die Position am Anfang oder Ende der Zeichenfolge liegt.\w
wird willkürlich als "Bezeichner" (Alnums und Unterstrich) definiert, was für Englisch nicht besonders nützlich ist.\bhello\b
ohne\b
(mit\w
,\W
und andere)?(^|\W)hello($|\W)
außer dass es vorher und nachher keine Nicht-Wort-Zeichen erfassen würde, also wäre es eher so(^|(?<=\W))hello($|(?=\W))
(unter Verwendung von Lookahead / Lookbehind-Behauptungen).(?<!\w)hello(?!\w)
.Eine Wortgrenze kann an einer von drei Positionen auftreten:
Wortzeichen sind alphanumerisch; ein Minuszeichen ist nicht. Entnommen aus dem Regex Tutorial .
quelle
Während ich den regulären Ausdruck lernte, steckte ich wirklich im Metazeichen fest
\b
. Ich habe seine Bedeutung tatsächlich nicht verstanden, als ich mich fragte: " Was ist es, was ist es ?" wiederholt ". Nach einigen Versuchen, die Website zu nutzen , achte ich auf die rosa vertikalen Striche an jedem Wortanfang und am Ende von Wörtern. Ich habe es damals gut verstanden. Es ist jetzt genau word (\w
) -gebunden .Meine Ansicht ist lediglich zu immens verständnisorientiert. Die dahinter stehende Logik sollte anhand anderer Antworten überprüft werden.
quelle
Eine Wortgrenze ist eine Position, der entweder ein Wortzeichen vorangestellt und nicht von einem gefolgt wird, oder gefolgt von einem Wortzeichen und nicht von einem vorangestellt.
quelle
Ich spreche darüber, welche
\b
Regex-Grenzen im Stil tatsächlich hier sind .Die Kurzgeschichte ist, dass sie bedingt sind . Ihr Verhalten hängt davon ab, neben was sie sich befinden.
Manchmal ist das nicht das, was du willst. Siehe meine andere Antwort zur Ausarbeitung.
quelle
Ich möchte die Antwort von Alan Moore erklären
Angenommen, ich habe eine Zeichenfolge "Dies ist ein C a t, und sie ist eine Wesome", und ich soll alle Vorkommen des Buchstabens 'a' nur ersetzen, wenn dieser Buchstabe an der "Grenze eines Wortes" existiert , d. H. Der Buchstabe
a
in 'Katze' sollte nicht ersetzt werden.Also werde ich Regex (in Python ) als ausführen
re.sub("\ba","e", myString.strip())
// ersetzena
durche
so dass der Ausgang Dies ist sein
e
c ein te
nd sie diee
wesomequelle
Ich lief in einem noch schlimmeren Problem , wenn der Text der Suche nach Wörtern wie
.NET
,C++
,C#
, undC
. Sie würden denken, dass Computerprogrammierer es besser wissen würden, als eine Sprache zu benennen, für die es schwierig ist, reguläre Ausdrücke zu schreiben.Wie auch immer, das habe ich herausgefunden (hauptsächlich zusammengefasst unter http://www.regular-expressions.info , was eine großartige Seite ist): In den meisten Arten von Regex sind Zeichen, die mit der Kurzzeichen-Zeichenklasse übereinstimmen,
\w
die Zeichen, die durch Wortgrenzen als Wortzeichen behandelt werden. Java ist eine Ausnahme. Java unterstützt Unicode für,\b
aber nicht für\w
. (Ich bin sicher, es gab damals einen guten Grund dafür).Das
\w
steht für "Wortzeichen". Es stimmt immer mit den ASCII-Zeichen überein[A-Za-z0-9_]
. Beachten Sie die Aufnahme des Unterstrichs und der Ziffern (aber nicht des Bindestrichs!). In den meisten Varianten, die Unicode unterstützen,\w
sind viele Zeichen aus anderen Skripten enthalten. Es gibt viele Inkonsistenzen darüber, welche Zeichen tatsächlich enthalten sind. Buchstaben und Ziffern aus alphabetischen Schriften und Ideogrammen sind in der Regel enthalten. Andere Interpunktionszeichen als der Unterstrich und die numerischen Symbole, die keine Ziffern sind, können enthalten sein oder auch nicht. XML Schema und XPath enthalten sogar alle Symbole in\w
. Java, JavaScript und PCRE stimmen jedoch nur mit ASCII-Zeichen überein\w
.Aus diesem Grund wird die Java-basierte Regex-Suche nach
C++
(C#
oder.NET
auch wenn Sie daran denken, dem Punkt und den Pluspunkten zu entkommen) von der verschraubt\b
.Hinweis: Ich bin mir nicht sicher, was ich gegen Fehler im Text tun soll, z. B. wenn jemand nach einem Punkt am Ende eines Satzes kein Leerzeichen setzt. Ich habe es zugelassen, bin mir aber nicht sicher, ob es unbedingt das Richtige ist.
Wenn Sie in Java nach Text für diese seltsam benannten Sprachen suchen, müssen Sie die
\b
Bezeichner vor und nach Leerzeichen und Satzzeichen ersetzen . Beispielsweise:Dann in Ihrem Test oder Ihrer Hauptfunktion:
PS Mein Dank geht an http://regexpal.com/, ohne den die Regex-Welt sehr elend wäre!
quelle
C#
Lesen Sie die Dokumentation zu den Randbedingungen:
http://java.sun.com/docs/books/tutorial/essential/regex/bounds.html
Schauen Sie sich dieses Beispiel an:
Beachten Sie beim Ausdrucken, dass die Ausgabe wie folgt lautet:
[Ich habe den Wert - in meiner Zeichenfolge gefunden.]
Dies bedeutet, dass das Zeichen "-" nicht als an der Grenze eines Wortes befindlich aufgenommen wird, da es nicht als Wortzeichen betrachtet wird. Sieht so aus, als hätte @brianary mich irgendwie geschlagen, also bekommt er eine Gegenstimme.
quelle
Die Wortgrenze \ b wird verwendet, wenn ein Wort ein Wortzeichen und ein anderes ein Nichtwortzeichen sein soll. Regulärer Ausdruck für negative Zahl sollte sein
Überprüfen Sie die funktionierende DEMO
quelle
Ich glaube, dass Ihr Problem auf die Tatsache zurückzuführen
-
ist , dass es sich nicht um ein Wortzeichen handelt. Somit stimmt die Wortgrenze nach dem überein-
und erfasst sie daher nicht. Wortgrenzen stimmen vor dem ersten und nach dem letzten Wortzeichen in einer Zeichenfolge sowie an jeder Stelle überein, an der es sich um ein Wortzeichen oder ein Nichtwortzeichen handelt und nach dem Gegenteil. Beachten Sie auch, dass die Wortgrenze eine Übereinstimmung mit der Breite Null ist.Eine mögliche Alternative ist
Dies entspricht allen Zahlen, die mit einem Leerzeichen und einem optionalen Bindestrich beginnen und an einer Wortgrenze enden. Es stimmt auch mit einer Zahl überein, die am Anfang der Zeichenfolge beginnt.
quelle
Ich denke, es ist die Grenze (dh die Zeichenfolge) der letzten Übereinstimmung oder der Anfang oder das Ende der Zeichenfolge.
quelle
\G
: Entspricht dem Anfang der Zeichenfolge (wie\A
) beim ersten Übereinstimmungsversuch; Danach entspricht es der Position, an der das vorherige Spiel beendet wurde.Wenn Sie dies verwenden
\\b(\\w+)+\\b
, bedeutet dies eine genaue Übereinstimmung mit einem Wort, das nur Wortzeichen enthält([a-zA-Z0-9])
In Ihrem Fall wird beispielsweise die Einstellung
\\b
zu Beginn von Regex-12
(mit Leerzeichen) akzeptiert, aber auch hier nicht-12
(ohne Leerzeichen).Als Referenz zur Unterstützung meiner Worte: https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html
quelle