2 Stimmen

regulärer Ausdruck zur Auswahl nach n-maligem Vorkommen eines bestimmten Zeichens

Hier werden einige Regex-Ausdrücke erstellt. Ich fragte mich, wenn ich einige Hinweise auf, wie man über die Auswahl einer Zeichenfolge nach n Vorkommen eines Zeichens und vor dem nächsten Vorkommen eines bestimmten Zeichens gehen könnte.

zum Beispiel

xyz|yui|i want to select this.

In diesem Beispiel möchte ich nach dem 2. "|" und vor dem nächsten "." auswählen. Der Text, den ich abgleichen möchte, lautet also "Ich möchte dies auswählen".

Ich bin für jeden Hinweis dankbar, danke.

UPDATE

Um genauer zu erklären, warum ich dies oben tun muss, gibt es mehr Text nach dem Punkt am Ende von "I want to select this.". Im Grunde handelt es sich dabei um einen nicht abgegrenzten Inhalt, den ich abgrenzen möchte. Bisher konnte ich die ersten beiden Felder abgrenzen, jetzt muss ich in der Lage sein, nur den Text nach dem letzten "|" und vor dem nächsten Punkt auszuwählen und ein "|"-Zeichen an das Ende anzufügen. Das gewünschte Ergebnis wäre also

xyz|yui|i want to select this.|

Es tut mir leid, dass ich nicht genauer auf das Ergebnis eingegangen bin, und ich hoffe, das klärt die Sache ein wenig auf. Danke für die Info, das ist super.

5voto

Korvin Szanto Punkte 4521

Ihre Regex würde wie folgt aussehen:

/^(?:.+?\|){2}(.+?[^(Co)]\.)/

PHP

<?php
    preg_match('/^(?:.+?\|){2}(.+?[^(Co)]\.)/','xyz|yui|This is a Co. sentence. Ending before this clause.',$out);
    echo $out[1];
?>

WIE AUCH IMMER

Sie sollten nach dem Pipe-Zeichen auflösen und so auf die entsprechenden Informationen zugreifen:

$stuff = explode('|','xyz|yui|i want to select this.');
echo $stuff[2];

2voto

KARASZI István Punkte 29899

Zunächst müssen Sie eine Gruppe erstellen, die den sich wiederholenden Teil enthält ([^|]+\|) hier, die genau zwei Mal erscheinen kann {2} , dann müssen Sie den Rest anpassen (.*) :

^([^|]+\|){2}(.*?)\.

Update

Sie können die Gruppierung aufheben, wie @Karolis erwähnte, mit ?:

^(?:[^|]+\|){2}(.*?)\.

Mit der ersten Regexp wird die zweite Übereinstimmung Ihre sein, mit der zweiten die erste.

1voto

ridgerunner Punkte 32111

Das wird genügen:

$text = 'xyz|yui|i want to select Co. this. But not this.';
$re = '/# Match stuff after nth occurance of a char.
    ^               # Anchor to start of string.
    (?:[^|]*\|){2}  # Everything up through 2nd "|"
    (               # $1: Capture up through next "."
      [^.]*         # Zero or more non-dot.
      (?:           # Allow dot if in "Co.".
        (?<=Co)     # If dot is preceded by "Co",
        \.          # then allow this dot.
        [^.]*       # Zero or more non-dot.
      )*            # Zero or more "Co." dots allowed.
      \.            # First dot that is not "Co."
    )               # End $1: Capture up through next "."
    /ix';
$text = preg_replace($re, '$0|', $text);
echo $text;

Bearbeiten 2011-09-28 10:00 MDT: Die Möglichkeit, Punkte zu überspringen, wurde hinzugefügt: "Co."
Bearbeiten 2011-09-28 10:30 MDT: Geändert zu verwenden preg_replace() um | nach dem Punkt einzufügen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X