Frage

Ich bin mit Java regulären Ausdrücke in Java 1.6 (unter anderem numerische Ausgabe parsen) und kann keine genaue Definition von \b ( „Wortgrenze“) finden. Ich hatte angenommen, dass -12 wäre ein „integer Wort“ (angepasst durch \b\-?\d+\b), aber es scheint, dass dies nicht funktioniert. Ich wäre dankbar, Möglichkeiten der Anpassung durch Leerzeichen getrennte Zahlen.

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());

Das gibt:

true
false
true
War es hilfreich?

Lösung

eine Wortgrenze, in den meisten regex Dialekten, ist eine Position zwischen \w und \W (non-Wort char), oder am Anfang oder am Ende einer Zeichenkette, wenn es beginnt oder endet (jeweils) mit einem Wortzeichen ([0-9A-Za-z_]) .

Also, in der Zeichenfolge "-12", wäre es vor den 1 entspricht oder nach dem 2. Der Bindestrich ist kein Wortzeichen.

Andere Tipps

Eine Wortgrenze kann in einer von drei Positionen auftreten:

  1. Vor dem ersten Zeichen in der Zeichenfolge, wenn das erste Zeichen ist ein Wortzeichen.
  2. Nach dem letzten Zeichen in der Zeichenfolge, wenn das letzte Zeichen ist ein Wortzeichen.
  3. Zwischen zwei Zeichen im String, wo man ist ein Wortzeichen und das andere ist kein Wortzeichen.

Word-Zeichen sind alphanumerisch; ein Minuszeichen ist es nicht. Genommen von Regex Tutorial .

eine Wortgrenze ist eine Position, die entweder durch ein Wortzeichen vorangeht, und nicht von einer gefolgt, oder gefolgt von einem Wortzeichen und nicht von einer vorausgegangen.

ich darüber reden, was \b-Stil regex Grenzen sind eigentlich hier .

Die kurze Geschichte ist, dass sie bedingte . Ihr Verhalten hängt davon ab, was sie neben.

# same as using a \b before:
(?(?=\w) (?<!\w)  | (?<!\W) )

# same as using a \b after:
(?(?<=\w) (?!\w)  | (?!\W)  )

Manchmal ist das nicht das, was Sie wollen. Sehen Sie meine andere Antwort für Ausarbeitung.

Überprüfen Sie die Dokumentation auf Randbedingungen aus:

http://java.sun.com/docs /books/tutorial/essential/regex/bounds.html

Mit dieser Probe Check out:

public static void main(final String[] args)
    {
        String x = "I found the value -12 in my string.";
        System.err.println(Arrays.toString(x.split("\\b-?\\d+\\b")));
    }

Wenn Sie es ausdrucken, feststellen, dass die Ausgabe folgendermaßen aus:

[fand ich den Wert - in meinem String.]

Das bedeutet, dass das Zeichen „-“ wird als an der Grenze eines Wortes nicht abgeholt, weil es kein Wortzeichen betrachtet wird. Sieht aus wie @brianary schlug mich irgendwie auf den Stempel, so dass er eine up-Stimme bekommt.

lief ich in ein noch schlimmeres Problem, wenn Text nach Worten suchen, wie .NET, C++, C# und C. Sie würden denken, dass Computer-Programmierer besser wissen würde, als eine Sprache etwas zu nennen, die für reguläre Ausdrücke zu schreiben ist schwer.

Wie auch immer, ist es das, was ich herausgefunden habe (zusammengefasst meist von http://www.regular-expressions.info , das ist ein großer Ort): In den meisten Aromen von regex, Zeichen, die die Charaktere durch die Kurz Hand Zeichenklasse \w abgestimmt sind, die als Wortzeichen von Wortgrenzen behandelt werden. Java ist eine Ausnahme. Java unterstützt Unicode für \b aber nicht für \w. (Ich bin sicher, gab es einen guten Grund dafür zu der Zeit).

Die \w steht für „Wortzeichen“. Sie paßt immer die ASCII-Zeichen [A-Za-z0-9_]. Beachten Sie die Einbeziehung des Unterstrichs und Ziffern (aber nicht Bindestrich!). In den meisten Aromen, die Unicode unterstützen, enthält \w viele Zeichen aus anderen Skripten. Es gibt eine Menge von Unstimmigkeit darüber, welche Zeichen tatsächlich enthalten sind. Buchstaben und Ziffern aus alphabetischen Skripte und ideographs sind in der Regel enthalten. Stecker Zeichensetzung außer dem Unterstrich und numerische Symbole, die nicht Ziffern können oder nicht enthalten sein. XML-Schema und XPath umfassen auch alle Symbole in \w. Aber Java, JavaScript und PCRE passen nur ASCII-Zeichen mit \w.

weshalb Java-basierten Regex sucht nach C++, C# oder .NET (auch wenn Sie daran denken, die Zeit und Pluspunkte zu entkommen) durch die \b geschraubt werden.

Hinweis: Ich bin nicht sicher, was über Fehler in Text zu tun, wie wenn jemand nicht einen Raum nach einem Punkt am Ende eines Satzes setzen. Ich ließ es, aber ich bin mir nicht sicher, dass es unbedingt das Richtige zu tun.

Wie auch immer, in Java, wenn Sie den Text für die diese seltsame genannte Sprache sind, müssen Sie die \b ersetzen vor und nach Leerzeichen und Interpunktion Bezeich. Zum Beispiel:

public static String grep(String regexp, String multiLineStringToSearch) {
    String result = "";
    String[] lines = multiLineStringToSearch.split("\\n");
    Pattern pattern = Pattern.compile(regexp);
    for (String line : lines) {
        Matcher matcher = pattern.matcher(line);
        if (matcher.find()) {
            result = result + "\n" + line;
        }
    }
    return result.trim();
}

Dann in Ihrem Test oder Hauptfunktion:

    String beforeWord = "(\\s|\\.|\\,|\\!|\\?|\\(|\\)|\\'|\\\"|^)";   
    String afterWord =  "(\\s|\\.|\\,|\\!|\\?|\\(|\\)|\\'|\\\"|$)";
    text = "Programming in C, (C++) C#, Java, and .NET.";
    System.out.println("text="+text);
    // Here is where Java word boundaries do not work correctly on "cutesy" computer language names.  
    System.out.println("Bad word boundary can't find because of Java: grep with word boundary for .NET="+ grep("\\b\\.NET\\b", text));
    System.out.println("Should find: grep exactly for .NET="+ grep(beforeWord+"\\.NET"+afterWord, text));
    System.out.println("Bad word boundary can't find because of Java: grep with word boundary for C#="+ grep("\\bC#\\b", text));
    System.out.println("Should find: grep exactly for C#="+ grep("C#"+afterWord, text));
    System.out.println("Bad word boundary can't find because of Java:grep with word boundary for C++="+ grep("\\bC\\+\\+\\b", text));
    System.out.println("Should find: grep exactly for C++="+ grep(beforeWord+"C\\+\\+"+afterWord, text));

    System.out.println("Should find: grep with word boundary for Java="+ grep("\\bJava\\b", text));
    System.out.println("Should find: grep for case-insensitive java="+ grep("?i)\\bjava\\b", text));
    System.out.println("Should find: grep with word boundary for C="+ grep("\\bC\\b", text));  // Works Ok for this example, but see below
    // Because of the stupid too-short cutsey name, searches find stuff it shouldn't.
    text = "Worked on C&O (Chesapeake and Ohio) Canal when I was younger; more recently developed in Lisp.";
    System.out.println("text="+text);
    System.out.println("Bad word boundary because of C name: grep with word boundary for C="+ grep("\\bC\\b", text));
    System.out.println("Should be blank: grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));
    // Make sure the first and last cases work OK.

    text = "C is a language that should have been named differently.";
    System.out.println("text="+text);
    System.out.println("grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));

    text = "One language that should have been named differently is C";
    System.out.println("text="+text);
    System.out.println("grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));

    //Make sure we don't get false positives
    text = "The letter 'c' can be hard as in Cat, or soft as in Cindy. Computer languages should not require disambiguation (e.g. Ruby, Python vs. Fortran, Hadoop)";
    System.out.println("text="+text);
    System.out.println("Should be blank: grep exactly for C="+ grep(beforeWord+"C"+afterWord, text));

P. S. Mein Dank geht an http://regexpal.com/ ohne die die Regex Welt wäre sehr unglücklich!

Im Zuge regulären Ausdrucks des Lernens, war ich in dem metacharacter wirklich stecken, das \b ist. Ich in der Tat nicht seine Bedeutung zu verstehen, während ich mich fragte, „ was es ist, was es ist, “ wiederholt. Nach einigen Versuchen von der Website , beobachte ich die rosa vertikale Striche am Anfang jeder aus Worte und am Ende von Worten. Ich habe es seine Bedeutung auch zu dieser Zeit. Es ist jetzt genau Wort (\w) -UMGRENZUNG .

Meine Ansicht ist lediglich immens Verstehen orientiert. Logik hinter der sollte von einer anderen Antworten überprüft werden.

Ich möchte Alan Moore 's Antwort erklären

  

eine Wortgrenze ist eine Position, die entweder durch ein Wortzeichen vorangeht, und nicht von einer gefolgt, oder gefolgt von einem Wortzeichen und nicht von einer vorausgegangen.

Angenommen, ich habe eine Zeichenfolge "Das ist a c a t und sie a wesome", und ich sollte alle Vorkommen ersetzen (e) die Buchstaben ‚a‘ nur dann, wenn dieser Brief ist noch vorhanden auf der „Boundry eines Wortes“ , dh die Buchstaben a innen ‚Katze‘ sollte nicht ersetzt werden.

So werde ich ausführen regex (in Python ) als

re.sub("\ba","e", myString.strip()) // ersetzen a mit e

so wird ausgegeben Dies ist e c a t end sie ewesome

Ich glaube, dass das Problem aufgrund der Tatsache ist, dass - kein Wortzeichen ist. Somit wird die Wortgrenze nach dem - übereinstimmen, und so wird es nicht erfassen. Wortgrenzen übereinstimmen vor dem ersten und nach dem letzten Wort Zeichen in einer Zeichenfolge, sowie überall dort, wo es vor dem Wortzeichen oder Nicht-Wortzeichen ist, und nachdem es ist das Gegenteil. Beachten Sie auch, dass Wortgrenze ist ein Null-Breite Spiel.

Eine mögliche Alternative ist

(?:(?:^|\s)-?)\d+\b

Dadurch werden alle Zahlen mit einem Leerzeichen und einem optionalen Bindestrich beginnen übereinstimmen, und an einer Wortgrenze endet. Es wird auch eine Reihe entspricht den Zeichenfolge am Anfang beginnen.

Wortgrenze \ b verwendet wird, wo ein Wort ein Wort Charakter sein sollte und ein anderer ein Nicht-Wortzeichen. Regulärer Ausdruck für negative Zahl sollte

--?\b\d+\b

Check Arbeits DEMO

Ich denke, es ist die Grenze (das heißt Zeichen nach) des letzten Spiel oder am Anfang oder Ende des Strings.

Wenn Sie \\b(\\w+)+\\b verwenden, die Mittel genau übereinstimmen mit einem Wort nur Wort-Zeichen enthalten ([a-zA-Z0-9])

in Ihrem Fall zum Beispiel Einstellung \\b am Anfang des Regex -12 akzeptieren (mit Leerzeichen), aber wieder wird es nicht -12 akzeptieren (ohne Leerzeichen)

Referenz meine Worte zu unterstützen: https: // docs. oracle.com/javase/tutorial/essential/regex/bounds.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top