Regex mit beliebig vielen Zeichen?

3 Antworten

Das hier dürfte die mit Abstand beste / eleganteste / sauberste / robusteste Lösung sein:



↑ Das ist Text und kein Bild. Kannst du also ganz normal in die Zwischenablage zur Weiternutzung kopieren!

Woher ich das weiß:Berufserfahrung

Frage ist was dazwischen darf alles stehen bedeutet. Geht es nur um Zeilen oder kann das Wort mehrfach kommen, sprich etwas ala:

SnjkfdngkD asdjsndjk SnsjdkfndD

Oder reden wir von einer Zeile, dazwischen können aber auch Sonderzeichen oder Leerzeichen sein?

S nsdjkfsndjfk D

Da du "Wort" schreibst klingt das für mich nach Ersten. Ich würde wohl etwas wie Folgendes nehmen:

(?<=(^|\s))S[^\s]*D(?=($|\s))
  1. Das schaut, dass vorne der Zeilenanfang ist oder ein Whitespace, das soll den Wortanfang darstellen.
  2. Anschließend schaut es nach dem großen S.
  3. Dann können beliebig oft etliche Zeichen außer Whitespaces kommen.
  4. Danach das große D.
  5. Und entweder das Zeilenende oder ein Whitespace, was das Wortende darstellt.

Ob das nun aber das ist, was du suchst und brauchst weiß ich nicht, dafür fehlen entsprechende Informationen, ob wir mehrere Wörter haben oder eine Zeile matchen, was "alles" ist, was dazwischen sein darf usw.

Wenn es nur um eine Zeile geht, sprich Zeilenanfang S und Zeilenende D und es auch mehrere Wörter sein können, dann reicht natürlich:

^S.*D$
Woher ich das weiß:Berufserfahrung – Softwareentwickler/Projektleiter seit 2012
apachy  16.08.2021, 15:03

Sehe gerade, es gibt auch Word Boundaries, sprich die Lookaheads/Behinds könnte man einfach durch:

\b

ersetzt. Also:

\bS[^\s]*D\b

Dann haste auch bei . und , ein Wortende. Kommt eben drauf an was du wirklich brauchst.

0
stdio  16.08.2021, 20:55
@apachy

Das würde aber auch SaDxSbD als einen einzigen Match finden, und nicht SaD und SbD als zwei getrennte Matches.

Zumindest habe ich den Fragensteller so verstanden, dass er keine greedy Ergebnisse haben will.

Was sagst du zu der Lösung aus meiner Antwort?

0
apachy  16.08.2021, 21:10
@stdio

Das ist in dem Fall ja auch noch ein "Wort", was mit einem großen S beginnt und mit einem großen D endet. Daher sagte ich ja auch, die Fragestellung ist zu ungenau bzw. lässt zu viel Interpretationsspielraum.

Wenn wir davon ausgehen, dass ein großes D das "Wort" abschließt und ein Wort nix ist, was ein Word Boundary hat oder ein Whitespace dahinter, dann passt deine Lösung natürlich.

Wobei dann auch wieder die Frage ist ob dazwischen darf alles stehen auch beinhaltet, dazwischen muss was stehen oder ob SD ebenso gehen sollte, dann müsste natürlich ein * statt einem + verwendet werden.

0
apachy  16.08.2021, 21:16
@apachy

Statt dem [^\s] geht natürlich auch ein \w, je nach Definition Wort und welche Zeichen dazwischen sein dürfen.

0
stdio  16.08.2021, 21:20
@apachy

Ja, die Fragestellung ist hier leider zu ungenau.

Da kann man nur raten. :)

0
stdio  16.08.2021, 21:22
@stdio

Statt [^\s] geht noch einfacher \S, wenn man "alle nicht whitespace-Zeichen" meint.

Und bei \w ist ja immer noch der Unterstrich und Zahlen mit bei ...

Wie gesaagt, was genau der Fragensteller unter "Wort" versteht, kann man leider nur raten.

0
TechPech1984  16.08.2021, 14:42

nix gut , das findet wirklich das größte wo ein S und irgendwo danach ein D ist , egal was dazwischen steht .

Sicher habe ich eine Dame

findet : Sicher habe ich eine D

wenn wir von casesentitiv ausgehen

0