2017-12-06 2 views
2

Ich extrahieren Teilstring (numerisch mit Unterstrich) aus einer Zeichenfolge mit Batch-Datei. Zum Beispiel:Extract Substring von Zeichenkette mit Batch

Ich habe AbC_d1344_454_78a. oder Deg_e23_74_67.

Ich möchte Teilstring 1344_454_78 und 23_74_67 extrahieren.

+0

Warum haben Sie PS in diesem markiert? Sie erwarten eine Batch-Lösung, oder? –

+1

Buchstäblich zwei Zeilen Batch-Code, um dies zu tun. Lesen Sie die Hilfe für den Befehl FOR und verwenden Sie die Option/F. – Squashman

+0

Ihr erstes Beispiel hat einen abschließenden Buchstaben, Ihre zweite jedoch nicht. Sollen wir führende oder nachfolgende Alpha-Zeichen von der Zeichenkette entfernen? – Squashman

Antwort

2

Sie haben ein paar Lösungen mit einer Batch-Datei.

Wenn Ihre Daten immer die gleiche Anzahl an Zeichen vor den Zahlen haben, können Sie eine einfache Teilzeichenfolge erstellen, um einen Teil der Zeichenfolge zu extrahieren. Damit werden die ersten fünf Zeichen aus der Zeichenfolge entfernt.

SET "VAR=AbC_d1344_454_78a" 
SET "VAR=%VAR:~5%" 

Aber an diesem Punkt haben Sie immer noch das Alpha-Zeichen am Ende. Sie können also einen einfachen findstr-Befehl ausführen, um zu sehen, ob am Ende ein Alpha-Zeichen vorhanden ist, und wenn dies der Fall ist, können Sie ihn mit einer anderen Teilzeichenkette wieder entfernen, um das letzte Zeichen zu entfernen.

SET "var=AbC_d1344_454_78a" 
SET "var=%var:~5%" 
echo %var%|findstr /R /I /C:"[a-z]$">nul &&SET "var=%var:~0,-1%" 

Eine weitere Option ist die FOR/F-Befehl zu verwenden und die Vorteile der delims Option nehmen Sie die Zeichenfolge in einzelne Variablen zu brechen durch den Unterstrich als Trennzeichen verwenden. Sie können alles nach dem ersten Unterstrich erhalten, der einer solchen Variablen zugewiesen ist.

FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H" 

Aber noch einmal, Sie haben jetzt eine führende und abschließende Alpha-Zeichen. Auch hier können Sie den Befehl FINDSTR verwenden, um dies zu testen und das führende und/oder nachfolgende Alpha-Zeichen zu entfernen.

FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H" 
echo %var%|findstr /R /I /C:"^[a-z]">nul &&SET "var=%var:~1%" 
echo %var%|findstr /R /I /C:"[a-z]$">nul &&SET "var=%var:~0,-1%" 

Wenn Sie mehrere Vorder- und Hinter Alpha-Zeichen haben Sie ein Label und gehe zu verwenden Iterieren über den FINDSTR Befehl zu halten.

FOR /F "TOKENS=1* DELIMS=_" %%G IN ("AbC_d1344_454_78a") DO SET "var=%%H" 
:leading 
echo %var%|findstr /R /I /C:"^[a-z]">nul &&(SET "var=%var:~1%" &GOTO leading) 
:trailing 
echo %var%|findstr /R /I /C:"[a-z]$">nul &&(SET "var=%var:~0,-1%" &GOTO trailing) 

Vertauschen Sie eines der Codebeispiele nach Ihren Wünschen.

+0

Danke @Squashman. Ich habe es – PSing

+1

Simpler: 'für/F" Tokens = 2 delims = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ "%% a in (" AbC_d1344_454_78a ") echo %% a' – Aacini

+0

... und los gehts. Upvoted, aber ich bleibe bei Powershell. –

-1

Mit Powershell Sie

$regex = [regex] '(?m)\d[\d_]*' 
$matchdetails = $regex.Match("AbC_d1344_454_78a. or Deg_e23_74_67") 
while ($matchdetails.Success) { 
    $matchdetails.Value 
    $matchdetails = $matchdetails.NextMatch() 
} 

Dies sucht nach einer Anzahl von einer beliebigen Anzahl von Zahlen gefolgt verwenden könnte oder unterstreicht

+1

Aber er fragt nach der Charge, oder? –

+1

@RandipDutta Powershell-Lösung könnte auch helfen – PSing

+0

@RanadipDutta - Nein, war er nicht. TheIncorrigible1 hat das Powershell-Tag entfernt. –

0

Eine andere Powershell

$entries = @('AbC_d1344_454_78a', 'Deg_e23_74_67') #example 
$entries | %{[System.Text.RegularExpressions.Regex]::Match($_, '(\d[\d_]+\d)').Value} 

auf der Formatierung der Eingangsdaten abhängig Vielleicht möchten Sie zu mehr oder weniger strengen Regexp gehen, z (\d[\d_]*) oder etwas spezifischer. Ich rate, http://regexr.com zu verwenden, um mit dem Regexp zu experimentieren.