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
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
Folgender String wird gelesen:
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
meine RegEx Skills halten sich, aufgrund der seltenen Anwendung, leider in Grenzen, weshalb ich mal eine Hilfe von euch Profis brauche
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6486939883
Url: https://administrator.de/contentid/6486939883
Ausgedruckt am: 18.12.2024 um 11:12 Uhr
15 Kommentare
Neuester Kommentar
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:
Ich würde die Leerzeichen noch mit reinnehmen, wenn die da immer sind ...
Grüße
lcer
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
.*\b(7[0-9]{6}).*
Cheers briggs
Zitat von @6247018886:
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
.*\b(7[0-9]{6}).*
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
Zitat von @chaot1coz:
So ähnlich versuche ich es auch:
Allerdings werden die Zeilen 1,2 und 4 nicht ersetzt:
https://regex101.com/r/IXlsCs/1
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
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:
hth
Erik
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
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:
hth
Erik
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.
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 🙈)
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:
hth
Erik
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
Hallo,
z.B.
Flags: gms
Liefert match 1:
Grüße
lcer
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
hab ich doch geschrieben:@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
entsprichtz.B.
.*(?<=(7[0-9]{6})).*
Liefert match 1:
aksjhaksghlkas NSLsf
sklvbaskjhbvak vjadv 09,00mm
123456416584 7001122 asvljalskjfg 564563
34893 ajksha
Grüße
lcer
OK, JavaScript ist auch kein Thema guckst du dieses Beispiel:
Ersetzt alles was nicht dem Pattern 7\d{6} entspricht durch nüscht es bleibt im Ergebnis die Nummer.
Online Demo
var result = `aksjhaksghlkas NSLsf
sklvbaskjhbvak vjadv 09,00mm
123456416584 7001122 asvljalskjfg 564563
34893 ajksha
`.replace(/.*\b(7\d{6}).*/is,"$1");
console.log(result);
Online Demo
Zitat von @6247018886:
OK, JavaScript ist auch kein Thema guckst du dieses Beispiel:
Ersetzt alles was nicht dem Pattern 7\d{6} entspricht durch nüscht es bleibt im Ergebnis die Nummer.
Online Demo
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);
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
Zitat von @chaot1coz:
Warum dann nicht gleich
tio.run
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.
So hier noch meine letzte Variante wenn man es mit Replace und ohne Submatch-Angabe machen muss, Replace Pattern kann hierbei leer bleiben.
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.
(?s).*(?=\b7\d{6})|(?<=\b7\d{6}).*
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.