/ / java: um eine vollständige Übereinstimmung eines Musters zu finden - Java, Pattern-Matching

Java: Um eine ganze Übereinstimmung eines Musters zu finden - Java, Pattern-Matching

Ich habe eine Funktion, die ein Wort in einer langen Zeichenfolge findet.

Die Zeile stimmt überein, wenn die Variable "v" die Zeichenfolge zwischen enthält <vocab></vocab>

if(p.matches("\W"+v+"\W"))

Ich möchte, dass diese Zeile übereinstimmt, dass v ein vollständiges Wort zwischen n oder t oder Leerzeichen ist und NICHT in einem anderen Wort enthalten ist.

Das ist meine Zeichenfolge:

<meta>
<vocab>called</vocab>
</meta>
<para>
called to-VP,Reid-NP,television cameras-NP
called to-VP,Reid-NP,one of-NP
one of-VP,Reid-NP,ornate rooms-NP
called to-VP,Reid-NP,Capitol-NP
called to-VP,Reid-NP,ceremony-NP
passed on-VP,last week-NP,spending bill-NP
passed on-VP,last week-NP,House-NP
passed on-VP,last week-NP,Senate-NP
officially complete-VP,ceremony-VP/NP,action-NP
called to-VP,television cameras-NP,one-NP
called in-VP,television cameras-NP,Capitol-NP
called for-VP,television cameras-NP,ceremony-NP
called-VP,Reid-NP,television cameras-NP
age-NP,last week-NP,event-num
</para>

Antworten:

0 für die Antwort № 1

Ich schlage vor, zu verwenden Pattern.quote(regex) für Ihre Variable v da es einige reguläre Metazeichen enthalten kann. Verwenden Sie Wortgrenzen, um sicherzustellen, dass Sie mit dem vollständigen Wort übereinstimmen. So sieht dein Muster aus:

Pattern p = Pattern.compile("\b" + Pattern.quote(v) + "\b");

0 für die Antwort № 2

Der korrekte reguläre Ausdruck lautet:

if (p.matches("(?s).*\b" + v + "\b.*"))

Hier gibt es einige wichtige Punkte:

  • (?s) bedeutet "Punkt stimmt mit Zeilenvorschub überein" und funktioniert daher bei mehrzeiliger Eingabe
  • Benutze die Regex b, das ist eine "Wortgrenze"
  • String.matches() muss mit dem übereinstimmen ganze String, der true zurückgibt, daher der .* an beiden enden so die ganze Zeichenfolge stimmt überein