Forum: PC-Programmierung Regex Wortende optional


von guelay (Gast)


Lesenswert?

Hallo zusammen,

ich habe beispielsweise den folgenden Text:

"Abc_01_BeispielText1"

Ich möchte einen Regex der sowohl den Text "Abc_01" als auch den Text 
"Abc_01_BeispielText1" erkennt. Alle anderen Kombinationen soll er nicht 
erkennt.

Mein bisheriger Regex ist: @"^Abc_(?<ref>\w{2})$"

Wie kann ich "BeispielText1" optional machen? Nach BeipsielText1 kommt 
das Wortende.

von Imonbln (Gast)


Lesenswert?

guelay schrieb:
> Hallo zusammen,
>
> ich habe beispielsweise den folgenden Text:
>
> "Abc_01_BeispielText1"
>
> Ich möchte einen Regex der sowohl den Text "Abc_01" als auch den Text
> "Abc_01_BeispielText1" erkennt. Alle anderen Kombinationen soll er nicht
> erkennt.
>
> Mein bisheriger Regex ist: @"^Abc_(?<ref>\w{2})$"
>
> Wie kann ich "BeispielText1" optional machen? Nach BeipsielText1 kommt
> das Wortende.

hier kannst du deine Regexp ausprobieren

https://regex101.com/r/BC025b/1/

so aus dem bauch heraus ^(Abc_\d{2})(?:_(.*))$ aber vielleicht gibt es 
was besseres

von Imonbln (Gast)


Lesenswert?

>
> so aus dem bauch heraus ^(Abc_\d{2})(?:_(.*))$ aber vielleicht gibt es
> was besseres

nachtrag sollte ^(Abc_\d{2})(?:_(.*))?$ heißen.

von guelay (Gast)


Lesenswert?

Imonbln schrieb:
>>
>> so aus dem bauch heraus ^(Abc_\d{2})(?:_(.*))$ aber vielleicht gibt es
>> was besseres
>
> nachtrag sollte ^(Abc_\d{2})(?:_(.*))?$ heißen.
Aber er soll am Ende nur BeispielText1 erkennen. Z.B. Beispieltext2 soll 
er nicht erkennen. Alle andere Textkombinationen soll er auch nicht 
erkennen. Nur "BeispielText1".

von guelay (Gast)


Lesenswert?

guelay schrieb:
> Imonbln schrieb:
>>>
>>> so aus dem bauch heraus ^(Abc_\d{2})(?:_(.*))$ aber vielleicht gibt es
>>> was besseres
>>
>> nachtrag sollte ^(Abc_\d{2})(?:_(.*))?$ heißen.
> Aber er soll am Ende nur BeispielText1 erkennen. Z.B. Beispieltext2 soll
> er nicht erkennen. Alle andere Textkombinationen soll er auch nicht
> erkennen. Nur "BeispielText1".

Ich möchte also nur diese Kombinationen erkennen: Abc_01 oder 
Abc_01_BeispielText1

von guelay (Gast)


Lesenswert?

guelay schrieb:
> Imonbln schrieb:
>>>
>>> so aus dem bauch heraus ^(Abc_\d{2})(?:_(.*))$ aber vielleicht gibt es
>>> was besseres
>>
>> nachtrag sollte ^(Abc_\d{2})(?:_(.*))?$ heißen.
> Aber er soll am Ende nur BeispielText1 erkennen. Z.B. Beispieltext2 soll
> er nicht erkennen. Alle andere Textkombinationen soll er auch nicht
> erkennen. Nur "BeispielText1".

Ich glaube das ist das was ich suche : ^(Abc_\d{2})(?:_(BeispielText1|))

von Imonbln (Gast)


Lesenswert?

guelay schrieb:
> Aber er soll am Ende nur BeispielText1 erkennen. Z.B. Beispieltext2 soll
> er nicht erkennen. Alle andere Textkombinationen soll er auch nicht
> erkennen. Nur "BeispielText1".

okay warum dann eine Regexp? ein Stringmatch am ende sollte deutlich 
Performanter sein  Wenn Rexep dann so

https://regex101.com/r/BC025b/4

^(Abc_\d{2})(?:_(BeispielText1))?

Meine Regexp wäre dann aber ^(Abc_\d{2}) und ein Stringvergleich auf das 
ende ob das "BeispielText1" ist. Wenn das statisch ist sollte der 
Stringvergleich mit regexp für den ersten teil deutlich besser für das 
Gesamtsystem sein.

Wenn "Abc_01" auch Statisch ist, dann zwei Stringvergleiche und keine 
regexp :D

von guelay (Gast)


Lesenswert?

Imonbln schrieb:
ay warum dann eine Regexp? ein Stringmatch am ende sollte deutlich
> Performanter sein  Wenn Rexep dann so
>
> https://regex101.com/r/BC025b/4
>
> ^(Abc_\d{2})(?:_(BeispielText1))?
>
> Meine Regexp wäre dann aber ^(Abc_\d{2}) und ein Stringvergleich auf das
> ende ob das "BeispielText1" ist. Wenn das statisch ist sollte der
> Stringvergleich mit regexp für den ersten teil deutlich besser für das
> Gesamtsystem sein.
>
> Wenn "Abc_01" auch Statisch ist, dann zwei Stringvergleiche und keine
> regexp :D

Abc ist statisch aber 01 nicht.

von sid (Gast)


Lesenswert?

greedy bis leerzeichen? [^\s]
Abc_(\w{2})(?:_[^\s]*)?

^ und $ machen in dem Fall die Sache eher komplizierter als einfacher 
mMn
ZeilenAnfang geht noch gut:

^Abc_(\w{2})(?:_[^\s]*)?

Aber sobald Du nach dem zeilenEnde mitsuchst wird's haarig falls 
zwischen capture und Zeilenende noch Text auftauchen kann.

ich bliebe also bei
^Abc_(\w{2})(?:_[^\s]*)?
das trifft
für
1
Abc_01_BeispielText1
2
Abc_02Beispieltext
3
Abc_10_Beispiel Text1
4
Abc_20_Beispiel
5
Abc_99 das hier nicht
Abc_01_BeispielText1 , Abc_02 , Abc_10_Beispiel , Abc_20_Beispiel , 
Abc_99

wie gesagt mit Zeilenende wird's mir zu haarig ;)

'sid

von DPA (Gast)


Lesenswert?

Exact Abc_01 oder Abc_01_BeispielText1, beliebige Position in Zeile:
1
Abc_01(_BeispielText1)?

Die erste Nummer variabel:
1
Abc_[0-9]{2}(_BeispielText1)?
Oder, falls \d erlaubt:
1
Abc_\d{2}(_BeispielText1)?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.