Wie passe ich nur für eine Instanz eines Wortes in einer Zeichenfolge an? Als Beispiel, mit "Fred" als mein Testwort, sollte Übereinstimmung für die Zeichenfolge "fredwilmawilliamjohn" TRUE sein, sollte aber für "fredwilmawilliamfred" FALSE sein?Wie passe ich nur für eine Instanz eines Wortes in einer Zeichenfolge an?
Antwort
Sie können die Anzahl der Übereinstimmungen mithilfe des Flags /g
im Listenkontext zählen und diesen Wert in einen skalaren Kontext konvertieren.
use strict;
use warnings;
use feature 'say';
for my $string (qw(fredwilmawilliamjohn fredwilmawilliamfred)) {
my $count =() = $string =~ m/(fred)/g;
if ($count == 1) {
say $string;
}
}
Der relevanteste Teil ist die =() =
, die das Spiel in Liste Kontext zwingt. Die my $count
wird dann diese Liste der Übereinstimmungen in einen skalaren Kontext zwingen, der Ihnen die Anzahl der Elemente in der Liste angibt. Das ist Ihre Anzahl an Übereinstimmungen.
kann es mit rein regexp getan werden? $ _ = "Fredwilliamwilma"; if (/ regexp /) {print "Es gibt nur einen Fred in der Zeichenkette"} – SKS
@SKS Sie meinen, Sie wollen die gesamte Logik in das Muster einfügen? Fred und Negativ schauen voraus, dass nichts oder nichts von Fred gefolgt ist, denke ich. Habe jetzt keinen Computer. Du musst es selbst versuchen. – simbabque
'=() =' wird auch als 'Ziegenoperator' bezeichnet :) – Sobrique
Es klingt, als ob Sie das Muster abgleichen und sicherstellen möchten, dass es nicht in der Folge auftritt. Wie wäre es damit, mit negativen Look-Ahead-
m/fred(?!.*fred)/
Brechen it down:
?! - nicht von
gefolgt. * - null oder mehr Zeichen
Dies wird nicht funktionieren, weil die Regexp versuchen wird, das negative Lookahead erfolgreich zu machen. Wenn es in der Zeichenfolge etwas findet, das nicht mit der zweiten Fred übereinstimmt, ist die Regex erfolgreich. '! m/fred (? =. * fred) /' würde hier funktionieren. –
@ChrisCharley im Prinzip richtig, aber Sie sagen es nicht richtig.Diese Regex wird verhindern, dass sie mit der ersten Fred übereinstimmt, aber der Anfang der Regex wird in der Folge weiter versucht und mit der zweiten Fred verglichen (die keine Fred hat) – ysth
@ysth Vielen Dank für die Klärung meiner Error. Ich sehe jetzt genau, wie die Regexp funktioniert. –
/fred(*COMMIT)(?!.*?fred)/s
(*COMMIT)
(in Perl 5.10 hinzugefügt) sagt nach fred
passenden, nicht Rückzieher nicht und versuchen Sie es erneut, wenn der Rest der Anpassung Regex schlägt fehl. Der Rest der Regex sagt nicht übereinstimmen, wenn .*?fred
(eine beliebige Anzahl von Zeichen gefolgt von Fred) an diesem Punkt, nach dem ersten fred übereinstimmt, d. H. Es gibt keine weitere fred.
Vor 5.10, müssen Sie den ersten fred in der Regex zwingen, mich nur auf den ersten fred wie so in der Zeichenfolge entsprechen:
/^(?:(?!fred).)*+fred(?!.*?fred)/s
(so lange ein beliebige Anzahl von Zeichen übereinstimmen, wie sie sind nicht der Anfang von fred, bevor der fred gefunden wird, der dann nicht von einem anderen fred gefolgt werden kann.
Oder
/^(?>.*?fred)(?!.*?fred)/s
(am Anfang der Zeichenfolge beginnen und ohne Rückzieher zu ermöglichen, finden die ersten fred, und behaupten, dass es keinen fred, nachdem es ist)
(Durchweg/s wird verwendet, um .
mit einem beliebigen Zeichen zu vergleichen, nicht nur mit einem Nicht-Zeilenumbruchzeichen.)
- 1. Wie passe ich eine ganze Zeichenfolge an eine Regex an?
- 2. Wie passe ich eine Zeichenfolge an, die an einer bestimmten Position in der Zeichenfolge beginnt?
- 3. Ersetzen nur das erste Auftreten eines Wortes in einer Zeichenfolge
- 4. Wie finde ich die Anzahl eines Wortes in einer Zeichenfolge?
- 5. Python: Wie passe ich die Zeichenfolge an - nur wenn die nächste Zeile eine bestimmte Zeichenfolge hat?
- 6. Wie passe ich eine logarithmische Normalverteilung an?
- 7. Entfernen eines Wortes aus einer Zeichenfolge C#
- 8. Wie passe ich Spymecached an net.sf.jsr107cache.Cache an?
- 9. Wie passe ich eine Methode an, die zu einer Instanz mit pymc3 gehört?
- 10. Wie passe ich eine QTableView-Höhe an den Inhalt an?
- 11. Wie passe ich eine Zeile an diese Daten an?
- 12. Wie passe ich Muster in einer ABAP-Select-Abfrage an?
- 13. Wie passe ich Akzentzeichen in preg_match() an?
- 14. Wie finde ich eindeutige Buchstaben in einer Zeichenfolge in Ruby und passe sie an?
- 15. Erkennen eines Wortes in einer Zeichenfolge in R
- 16. Wie finde ich eine Instanz eines ganzen Wortes in Java (Android)? für die Benutzer-Tagging auf einer Social-Media-App
- 17. Entfernen eines Wortes in einer Zeichenkette (RemoveString)
- 18. Wie passe ich zwei/+ Hintergrundbilder an?
- 19. Wie passe ich jedes Wort in einer Zeichenfolge außer dem letzten Wort an?
- 20. Wie passe ich diesen Regex an?
- 21. Die Wahrscheinlichkeit eines Wortes in einer Zeichenfolge ermitteln
- 22. Wie passe ich eine Kurve an eine Reihe von segmentierten Linien in Matlab an?
- 23. Wie passe ich eine Polynomkurve mit D3 an?
- 24. Wie passe ich Typen an, die keine bestimmte Typklasseninstanz haben?
- 25. Hervorhebung eines Wortes innerhalb einer Zeichenfolge mit eckigen
- 26. Wie erstelle ich eine Instanz von * os.File aus einer Zeichenfolge?
- 27. Wie passe ich alles nach @ bis Leerzeichen an?
- 28. Wie passe ich eine Funktion mit PyBrain-Netzwerken an?
- 29. Wie passe ich eine Textur an eine Oberfläche an? ARKit SceneKit Swift
- 30. Funktionen an einer Instanz eines Elements anhängen
Wenn Sie die Übungen in _Learning Perl_ machen, sollten Sie sie selbst machen. – simbabque