em-pie
Goto Top

Regex: Treffer eines Number-Patterns negieren

Guten Morgen zusammen,


meine RegEx Skills halten sich, aufgrund der seltenen Anwendung, leider in Grenzen, weshalb ich mal eine Hilfe von euch Profis brauche face-smile

Ich habe aus einem QR Code eine variable Zeichenlänge mit div. CRLFs.
Ich brauche nur eine bestimmte Zahlenkombination daraus und würde zur weiteren Verarbeitung den Rest gerne durch "" (also nichts) ersetzen. Bzw. ich muss das ersetzen, da ich mit dem Tool, welches den Code ausliest keine Patterns extrahieren kann, dafür aber Patterns durch was anderes ersetzen kann.

Folgender String wird gelesen:

aksjhaksghlkas NSLsf
sklvbaskjhbvak vjadv 09,00mm
123456416584 7001122 asvljalskjfg 564563
34893 ajksha
Ich brauche nur die 7001122, wobei die Zahl immer mit 7 beginnt und die nachfolgenden 6 Stellen Werte zwischen 0 und 9 annehmen können.

Mittels 7[0-9]{6] bekomme ich den ermittelt. Für das Ersetzen muss ich aber genau das Gegenteil haben, damit ich eben alles AUßER die 7001122 ersetzen kann.

Mit 'nem RegEx-Tester bin ich aber jedes Mal gescheitert, da er auch die übrigen Zahlen-Werte gefunden hat.
Mit [^0-9]+ etc. kam ich nicht weiter. Da gab es dann (mit verschiedenen Versuchen) entweder gar keinen oder zu viele Matches.

Könnt ihr mir hier helfen?


Schon mal besten Dank!

Gruß
em-pie

Content-ID: 6486939883

Url: https://administrator.de/contentid/6486939883

Ausgedruckt am: 17.11.2024 um 07:11 Uhr

lcer00
lcer00 24.03.2023 um 09:31:49 Uhr
Goto Top
Hallo,

ich habe das jetzt nicht sofort parat. Aber ich vermute, du solltest die Aufgabe teilen. Im Prinzip hast Du 3 Suchabschnitte.
1) der Teil vor dem Suchstring
2) der Suchstring
3) der Teil nach dem Suchstring.

Dazu brauchst Du Lookaheads und Loogbehinds:
https://www.rexegg.com/regex-lookarounds.html

irgendwie so:
(?=(7[0-9]{6}))

Ich würde die Leerzeichen noch mit reinnehmen, wenn die da immer sind ...

Grüße

lcer
6247018886
6247018886 24.03.2023 aktualisiert um 09:35:03 Uhr
Goto Top
.*\b(7[0-9]{6}).*
Und als Ersetzung dann $1 oder \1 für den Submatch nehmen, je nachdem was das Teil akzeptiert bzw. welche Regex Engine es benutzt.

Cheers briggs
3063370895
3063370895 24.03.2023 um 09:36:37 Uhr
Goto Top
Zitat von @6247018886:

.*\b(7[0-9]{6}).*
Und als Ersetzung dann $1 oder \1 für den Submatch nehmen, je nachdem was das Teil akzeptiert bzw. welche Regex Engine es benutzt.

Cheers briggs

So ähnlich versuche ich es auch:
.*(7\d{6}).*

Allerdings werden die Zeilen 1,2 und 4 nicht ersetzt:
https://regex101.com/r/IXlsCs/1
6247018886
6247018886 24.03.2023 aktualisiert um 09:39:10 Uhr
Goto Top
Zitat von @chaot1coz:
So ähnlich versuche ich es auch:
.*(7\d{6}).*

Allerdings werden die Zeilen 1,2 und 4 nicht ersetzt:
https://regex101.com/r/IXlsCs/1

Du musst den S Flag setzen damit der Punkt auch Newlines matcht ...
https://regex101.com/r/971fi4/1
erikro
erikro 24.03.2023 um 09:44:40 Uhr
Goto Top
Moin,

Denkfehler. Du willst als Ergebnis die Zahl. Du willst nicht alles andere ersetzen. Leider sagst Du nichts über die Programmiersprache. Deshalb als Powershell. In jeder anderen geht es aber auch so:

PS C:\> $matches =select-string ".*(7[0-9]{6}).*" -InputObject "123456416584 7001122 asvljalskjfg 564563123456416584 7001122 asvljalskjfg 564563123456416584 7001122 asvljalskjfg 564563"  
PS C:\> $matches.Matches.groups[1].value
7001122

hth

Erik
3063370895
3063370895 24.03.2023 um 09:46:54 Uhr
Goto Top
Zitat von @erikro:

Moin,

Denkfehler. Du willst als Ergebnis die Zahl. Du willst nicht alles andere ersetzen. Leider sagst Du nichts über die Programmiersprache. Deshalb als Powershell. In jeder anderen geht es aber auch so:

PS C:\> $matches =select-string ".*(7[0-9]{6}).*" -InputObject "123456416584 7001122 asvljalskjfg 564563123456416584 7001122 asvljalskjfg 564563123456416584 7001122 asvljalskjfg 564563"  
PS C:\> $matches.Matches.groups[1].value
7001122

hth

Erik

ich muss das ersetzen, da ich mit dem Tool, welches den Code ausliest keine Patterns extrahieren kann, dafür aber Patterns durch was anderes ersetzen kann.
6247018886
6247018886 24.03.2023 aktualisiert um 10:04:52 Uhr
Goto Top
Leider fehlen wie so oft hier Infos welches System dahinter steckt, so könnte man die Spezifikationen der verwendeten Regex-Engine ermitteln und so auch ohne extra Ratestunde besser beraten ... Aber wat solls is ja eh F🐟-Tag und verlängertes Wochenende (Montag ist in Deutschland bundesweit Gewerkschafter-Ruhetag 🙈)
erikro
erikro 24.03.2023 um 10:16:17 Uhr
Goto Top
Zitat von @chaot1coz:

Zitat von @erikro:

Moin,

Denkfehler. Du willst als Ergebnis die Zahl. Du willst nicht alles andere ersetzen. Leider sagst Du nichts über die Programmiersprache. Deshalb als Powershell. In jeder anderen geht es aber auch so:

PS C:\> $matches =select-string ".*(7[0-9]{6}).*" -InputObject "123456416584 7001122 asvljalskjfg 564563123456416584 7001122 asvljalskjfg 564563123456416584 7001122 asvljalskjfg 564563"  
PS C:\> $matches.Matches.groups[1].value
7001122

hth

Erik

ich muss das ersetzen, da ich mit dem Tool, welches den Code ausliest keine Patterns extrahieren kann, dafür aber Patterns durch was anderes ersetzen kann.

Na dann so:

$new_string1= "was auch immer"  
$new_string2="noch was"  
$matches =select-string ".*(7[0-9]{6}).*" -InputObject "123456416584 7001122 asvljalskjfg 564563123456416584 7001122 asvljalskjfg 564563123456416584 7001122 asvljalskjfg 564563"  
$output = $new_string1 + $matches.Matches.groups[1].value + $new_string2
em-pie
em-pie 24.03.2023 um 10:17:04 Uhr
Goto Top
Zitat von @6247018886:

Leider fehlen wie so oft hier Infos welches System dahinter steckt, so könnte man die Spezifikationen der verwendeten Regex-Engine ermitteln und so auch ohne extra Ratestunde besser beraten ... Aber wat solls is ja eh F🐟-Tag und verlängertes Wochenende (Montag ist in Deutschland bundesweit Gewerkschafter-Ruhetag 🙈)
Ach komm, sonst liefere ich ja eigentlich (bei meinen seltenen Fragen hier) immer möglichst alle Infos. Aber hier hast du recht, hab ich vergessen zu nennen.
=> WebApp mit Javascript

@eure Vorschläge:
Als Treffer erhalte ich immer exakt die Nummer, die ich am Ende übrig behalten will. Ich brauche aber alles andere, um den Ersetzungsprozess laufen lassen zu können.
Ich brauche alles, was NICHT 7001122 entspricht.
lcer00
lcer00 24.03.2023 um 10:26:54 Uhr
Goto Top
Hallo,

Zitat von @em-pie:

@eure Vorschläge:
Als Treffer erhalte ich immer exakt die Nummer, die ich am Ende übrig behalten will. Ich brauche aber alles andere, um den Ersetzungsprozess laufen lassen zu können.
Ich brauche alles, was NICHT 7001122 entspricht
hab ich doch geschrieben:

z.B.
.*(?<=(7[0-9]{6})).*
Flags: gms

Liefert match 1:
aksjhaksghlkas NSLsf
sklvbaskjhbvak vjadv 09,00mm
123456416584 7001122 asvljalskjfg 564563
34893 ajksha

Grüße

lcer
6247018886
6247018886 24.03.2023 aktualisiert um 10:35:24 Uhr
Goto Top
OK, JavaScript ist auch kein Thema guckst du dieses Beispiel:
var result = `aksjhaksghlkas NSLsf
sklvbaskjhbvak vjadv 09,00mm
123456416584 7001122 asvljalskjfg 564563
34893 ajksha
`.replace(/.*\b(7\d{6}).*/is,"$1");  
console.log(result);
Ersetzt alles was nicht dem Pattern 7\d{6} entspricht durch nüscht es bleibt im Ergebnis die Nummer.

Online Demo
3063370895
3063370895 24.03.2023 um 10:39:24 Uhr
Goto Top
Zitat von @6247018886:

OK, JavaScript ist auch kein Thema guckst du dieses Beispiel:
var result = `aksjhaksghlkas NSLsf
sklvbaskjhbvak vjadv 09,00mm
123456416584 7001122 asvljalskjfg 564563
34893 ajksha
`.replace(/.*\b(7\d{6}).*/is,"$1");  
console.log(result);
Ersetzt alles was nicht dem Pattern 7\d{6} entspricht durch nüscht es bleibt im Ergebnis die Nummer.

Online Demo

Warum dann nicht gleich

let result = `aksjhaksghlkas NSLsf
sklvbaskjhbvak vjadv 09,00mm
123456416584 7001122 asvljalskjfg 564563
34893 ajksha
`.match(/7\d{6}/);

tio.run
6247018886
6247018886 24.03.2023 aktualisiert um 10:45:17 Uhr
Goto Top
Zitat von @chaot1coz:
Warum dann nicht gleich

let result = `aksjhaksghlkas NSLsf
sklvbaskjhbvak vjadv 09,00mm
123456416584 7001122 asvljalskjfg 564563
34893 ajksha
`.match(/7\d{6}/);

tio.run

Weil er anscheinend in der App nur Ersetzen statt "matchen" kann wie er oben ja jetzt nun zum xten mal schreibt!

Naja lassen wir den TO erst mal machen, genügend Input hat er ja jetzt.
6247018886
Lösung 6247018886 24.03.2023 aktualisiert um 11:22:18 Uhr
Goto Top
So hier noch meine letzte Variante wenn man es mit Replace und ohne Submatch-Angabe machen muss, Replace Pattern kann hierbei leer bleiben.
(?s).*(?=\b7\d{6})|(?<=\b7\d{6}).*
https://regex101.com/r/FCmSkD/1
Das (?s) zu beginn ist für das Matchen von Zeilenumbrüchen mit dem Punkt(.) wenn man die Regex Optionen in der App nicht setzen kann.
em-pie
em-pie 24.03.2023 um 11:41:13 Uhr
Goto Top
Zitat von @6247018886:

So hier noch meine letzte Variante wenn man es mit Replace und ohne Submatch-Angabe machen muss, Replace Pattern kann hierbei leer bleiben.
(?s).*(?=\b7\d{6})|(?<=\b7\d{6}).*
https://regex101.com/r/FCmSkD/1
Das (?s) zu beginn ist für das Matchen von Zeilenumbrüchen mit dem Punkt(.) wenn man die Regex Optionen in der App nicht setzen kann.

Genau das suchte ich:
regex

Vielen Dank @6247018886


Ich hab halt, wie oben versucht zu beschreiben, ein Feld, in dem ich den gesamt String "übergebe". Im zweiten dann das RegEx, welches angewendet wird, um im Dritten Feld dann den Treffer mit zu ersetzenden Zeichen füllen kann

Also
String       | Regex                              | Zeichen
QR Coce-Scan | (?s).*(?=\b7\d{6})|(?<=\b7\d{6}).* | ""  

@rest:
Natürlich auch euch danke für den Input. Das kommt in jedem Fall in meine Sammlung (wer weiss, wozu ich die Ansätze mal gebrauchen kann) face-smile