In Java muss ich <a>
-Tags in einer Zeichenkette ohne href-Attribut finden. Zum Beispiel in der folgenden Zeichenfolge:
sollte nicht mit <a class="aClass" href="#">link1</a>
übereinstimmen (weil es href enthält), aber es sollte mit <a class="aClass" target="_blank">link2</a>
übereinstimmen (weil es keine href enthält).
Ich habe es geschafft, die RegEx so zu erstellen, dass sie meinen Tags entspricht:
%Vor%aber ich kann nicht herausfinden, wie man Tags mit href
eliminiert(Ich weiß, dass ich HTML-Parser usw. verwenden kann, aber ich muss dies mit RegEx tun.
Seien Sie vorsichtig mit Regexs wie <a[^>]*
, da diese auch mit anderen gültigen HTML-Tags übereinstimmen, die mit einem a
wie <abbr>
oder <address>
beginnen. Auch die Suche nach der Zeichenfolge href
ist nicht gut genug, da diese Zeichenfolge innerhalb des Werts eines anderen Attributs oder wie <a class="thishrefstuff"...
oder Teil eines anderen Attributs wie <a hreflang="en"...
Dieser Ausdruck wird:
<a
... </a>
, die kein href
-Attribut enthalten. a
und nicht eines Tags, das einfach mit dem Buchstaben a
like <address>
beginnt.
href
in den Namen des Attributs eingebettet ist, wie das gültige hreflang='en'
oder das erfundene Attributehref="some value"
. bogus='href=""'
<a(?=\s|>)(?!(?:[^>=]|=(['"])(?:(?!).)*)*?\shref=['"])[^>]*>.*?<\/a>
<a(?=\s|>)
stimmt mit dem offenen Tag überein und stellt sicher, dass der nächste Name nach dem Tag entweder ein Leerzeichen oder die schließende Klammer ist. Dies zwingt den Namen zu a
und nicht zu etwas anderem (?!
startet den negativen Blick voraus, wenn wir eine href in diesem Tag finden, dann ist diese Art von Tag nicht das Tag, nach dem wir suchen
(?:
startet die Nicht-Capture-Gruppe, um sich durch alle Zeichen innerhalb des Tags zu bewegen [^>=]
stimmt mit allen nicht abschließenden Zeichen überein, wodurch verhindert wird, dass die Regex-Engine das Tag verlässt, und ungleiche Zeichen, die verhindern, dass die Engine blind mit allen Zeichen übereinstimmt |
oder =(['"])
entspricht einem Gleichheitszeichen, gefolgt von einem offenen Doppel- oder einfachen Anführungszeichen. Das Zitat wird in Gruppe 2 aufgenommen, damit es später korrekt gepaart werden kann (?:(?!).)*
stimmt mit allen Zeichen überein, die nicht das enge Zitat sind, das dem offenen Zitat
stimmt mit dem korrekten nahen Zitat )*?
schließt die Nicht-Capture-Gruppe und wiederholt so oft wie nötig bis \shref=['"]
stimmt mit dem gewünschten href-Attribut überein. Die \s
und =["']
stellen sicher, dass der Attributname einfach href )
schließt den negativen Lookahead [^>]*>.*?<\/a>
entspricht der gesamten Zeichenfolge von "Öffnen" bis "Schließen" Eingabetext
<abbr>RADIO</abbr> text <a class="aClass" href="#">link1</a> text <a bogus='href=""' class="aClass" target="_blank">link2</a> text
Code
Wenn Sie dies in einer Replace-Funktion verwenden möchten, um nicht-href-anchor-Tags zu entfernen, ersetzen Sie einfach alle Treffer durch nichts.
%Vor%Entspricht
%Vor%Ich finde es merkwürdig, dass Sie brauchen , um es mit Regex zu tun, aber Sie können einen negativen Lookahead verwenden.
%Vor%Ich bin kein Java-Experte, aber Sie können so etwas ausprobieren:
%Vor%Eine Option, die Sie haben, besteht darin, alle -Tags zuerst zu suchen und dann eine Regex zu verwenden, um diejenigen zu finden, die Sie haben, so dass Sie sie ignorieren können. So würde Ihr Pseudocode aussehen:
%Vor%