Anfang und ende eines strings soll gleich sein

Dieses Dokument zeigt einfache Beispiele im Umgang mit Zeichenketten.

Contents

  • Definition
  • Datentyp
  • Vektor oder Array von Zeichen
  • Umwandlungen in einen anderen Datentyp
  • ASCII-Werte
  • Konvertierung
  • Indizierung
  • Kleinbuchstaben, Grossbuchstaben
  • Zellen-Arrays von Zeichenketten (Advanced)
  • Teilen und Zusammenfuegen
  • Weitere Moeglichkeiten
  • Download

Definition

Zeichenketten (strings) werden in MATLAB mit Hilfe des einfachen Hochkommas definiert, also 'text' und nicht "text", wie in manchen anderen Programmiersprachen.

str0 = 'null'; str1 = 'eins'; str2 = 'zwei'
str2 =

zwei

Datentyp

Der Datentyp ist char (character), der mit dem Befehl class abgefragt werden kann. Ausserdem kann man auch mit den Befehlen isa, bzw., ischar feststellen, ob es sich bei einer Variablen um diesen Datentyp handelt. Diese liefern als Antwort true (1), wenn es sich um ein Zeichenkette handelt oder false (0), wenn es keine Zeichenkette ist.

class_str0 = class(str0); 
class_val  = class(pi);   
L1 = isa(str0,'char');    
L2 = ischar(str0);        
L3 = ~ischar(str0);       
L4 = ischar(pi);          
L5 = isnumeric(pi);       

Vektor oder Array von Zeichen

Bei Zeichenketten handelt es sich in den meisten Faellen um einen Zeilenvektor von Zeichen, es sind aber auch mehrdimensionale Arrays von Zeichen moeglich.

name     = 'Franz Welser-Moest';
name_alt = ['Franz',' ','Welser','-','Moest']; 
zahl_arr = ['null  ';'eins  ';'zwei  ';'drei  ';'vier  '; ...
            'fuenf ';'sechs ';'sieben';'acht  ';'neun  ']





zahl_arr =

null  
eins  
zwei  
drei  
vier  
fuenf 
sechs 
sieben
acht  
neun  

Da es sich also um Arrays handelt, kann man, z.B., die Befehle fuer Dimension oder Groesse ndims, size, numel, length verwenden.

ndims_name  = ndims(name);   
size_name   = size(name);    
numel_name  = numel(name);   
length_name = length(name);  

Umwandlungen in einen anderen Datentyp

Hier muss man zwei unterschiedliche Arten von Umwandlungen beachten, entweder mit den Befehlen double und char, oder mit den Befehlen str2num, num2str und mat2str.

ASCII-Werte

Im ersten Fall werden die einzelnen Zeichen mit double in ihren ASCII-Wert (siehe ASCII ) verwandelt.

str = '09AZaz';
ascii_str = double(str); 

Die Zahlen im Vektor ascii_str repraesentieren hier die Position in der Tabelle als Dezimalwert '0' (Position:48), '9' (Position: 57), usw., der Bereich der Zahlen 0 bis 9 reicht dabei von 48 bis 57, die Grossbuchstaben von 65 bis 90 und die Kleinbuchstaben von 97-122. Der Umfang aller druckbaren Zeichen reicht von 32 (Leerzeichen) bis 126 (Tilde ~). Alle druckbaren Zeichen erhaelt in einer Zeichenkette erhaelt man mit den Befehl:

str_druck = char(32:126)
str_druck =

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Ein praktisches Zeichen aus dem nicht druckbaren Bereich ist char(10) (LF, linefeed, Zeilenumbruch). Obwohl der Output hier wie ein dreizeiliges Array aussieht, handelt es sich um einen Zeilenvektor mit acht Zeichen (6 Buchstaben, 2 mal LF).

str_lf = ['ab',char(10),'cd',char(10),'ef']
numel(str_lf); 
str_lf =

ab
cd
ef

Konvertierung

Im zweiten Fall moechte man nun Zeichen in jene Zahl verwandeln, die sie darstellen, also z.B., die Zeichenkette '3.14' (class: char) in die Zahl 3.14 (class: double). Dies kann man mit str2num durchfuehren, aber natuerlich nur dann, wenn die Zeichenkette eine Zahl darstellt. In die andere Richtung funktioniert die Umwandlung mit num2str oder mat2str.

num_str = '3.14';
num_val = str2num(num_str); 

Die Umwandlung einer Zahl (eines Arrays) in eine Zeichenkette wird oft fuer die Ausgabe von Ergebnissen gebraucht, die man durch Berechnungen erhalten hat und mit einer Erkaerung ausgeben will. Dabei ist die Umwandlung norwendig, da man nicht zwei verschiedene Datentypen in einem Array zusammenfuegen koennte.

res = 2*pi/3; 
res_str = ['Resultat: ',num2str(res)] 
res_str_mod = ['Resultat: ',num2str(res,10)] 
vec = 1:5; 
vec_str = ['Vektor: ',mat2str(vec)] 
res_str =

Resultat: 2.0944


res_str_mod =

Resultat: 2.094395102


vec_str =

Vektor: [1 2 3 4 5]

Indizierung

Da es sich bei Zeichenketten um Arrays handelt, kann man mit Hilfe der Indizierung auf Teile von Zeichenketten zugreifen. Wie in MATLAB ueblich gibt es einen Einzelindex (ein Index von Anfang bis Ende des Arrays) oder Sub-Indices (z.B. Zeilen und Spalten in einem zweidimensionalen Array). Beachten sie dabei, dass man das Keyword end verwenden kann (letztes Zeichen oder letzte Zeile (Spalte))

vorname  = name(1:5);   
nachname = name(7:end); 
zeilen = zahl_arr(2:2:6,1:end) 



zeilen =

eins  
drei  
fuenf 

Kleinbuchstaben, Grossbuchstaben

Mit den Befehlen lower und upper kann man Zeichenketten in Klein- oder Grossbuchstaben verwandeln.

vorname_klein = lower(vorname); 
vorname_gross = upper(vorname); 

Will man nur Teile eines Arrays in Grossbuchstaben verwandeln muss man auch die Indizierung zu Hilfe nehmen. Als Beispiel dient hier unsere Variable zahl_arr, wobei nun die Anfangsbuchstaben in allen Zeilen gross geschrieben werden sollen.

zahl_arr_g = zahl_arr; 
zahl_arr_g(:,1) = upper(zahl_arr_g(:,1)); 

Ohne Anlegen einer Kopie haette man die Aufgabe auch mit dem folgendem Befehl durchfuehren koennen, wobei hier die umgewandelte erste Spalte mit den Spalten 2 bis end (letzte) zusammengesetzt wird:

zahl_arr_g = [upper(zahl_arr_g(:,1)),zahl_arr_g(:,2:end)];

Zellen-Arrays von Zeichenketten (Advanced)

Der Datentyp cell ist eine Art Behaelter (Container) in dem alle MATLAB-Datentypen in Form eines Zellen-Arrays gespeichert werden koennen. Dies wird hier an Hand unseres Arrays zahl_arr demonstriert. Beim Zellen-Array werden jetzt statt der eckigen Klammern [] die geschwungenen Klammern verwendet und die Laenge der einzelnen Zeichenketten muss nicht mehr gleich lang sein. Im Prinzip koennten die einzelnen Zellen im Zell-Array auch unterschiedliche Datentypen haben, es muessten also nicht alle vom Typ char sein.

zahl_carr = {'null','eins','zwei','drei','vier', ...
            'fuenf','sechs','sieben','acht','neun'}
zahl_carr = 

  Columns 1 through 7

    'null'    'eins'    'zwei'    'drei'    'vier'    'fuenf'    'sechs'

  Columns 8 through 10

    'sieben'    'acht'    'neun'

Statt die einzelen Zeichenketten wieder haendisch zu schreiben, gibt es natuerlich auch dafuer eine MATLAB-Loesung mit Hilfe der Befehle num2cell (Umwandlung in ein Zell-Array) und deblank (Entfernen von Leerzeichen am Anfang und am Ende einer Zeichenkette)

zahl_carr = deblank(num2cell(zahl_arr,2));

Im Gegensatz zur Groesse von zahl_arr (10 Zeilen, 7 Spalten) hat die Groesse dex Zellen-Arrays nichts mit dem Inhalt sondern mit der Groesse des Zellen-Arrays selbst zu tun (1 Zeile, 10 Spalten). Wichtig zu wissen ist auch, dass man mit Hilfe der geschwungenen Klammer auf einzelne Elemente eines Zell-Arrays zugreifen kann.

size(zahl_arr);     
size(zahl_carr);    
size(zahl_carr{1}); 

Teilen und Zusammenfuegen

Zeichenketten koennen mit strsplit an bestimmten Trennzeichen geteilt werden. Die einzelnen Teile stehen dann als Elemente in einem Zellen-Array

name_c = strsplit(name); 
vorname  = name_c{1};    
nachname = name_c{2};    
nachname_c = strsplit(nachname,'-') 
nachname_c = 

    'Welser'    'Moest'

Die einzelnen Buchstaben einer Zeichenkette koennen mit dem Befehl num2cell getrennt werden. Dabei wird jedes Element (jeder Buchstabe) der Zeichenkette als eine Zelle in einem Zellen-Array gespeichert.

numbers   = '0123456789';
numbers_c = num2cell(numbers); 





zahl_str_1 = strjoin(zahl_carr); 

zahl_str_2 = strjoin(zahl_carr,'-'); 

zahl_str_3 = strjoin(zahl_carr,char(10)); 

Man kann nun das Zellen-Array numbers_c verwenden und die einzelnen Zeichen mit einem gewaehlten Fuell-String wieder zusammensetzen:

numbers_f = strjoin(numbers_c,'+'); 

Weitere Moeglichkeiten

Man kann in MATLAB eine Zeichenkette auch evaluieren, d.h. die Anweisungen in der Zeichenkette als Programmteil ausfuehren. Der Befehl dafuer ist eval. Im vorliegenden Fall ist das die Addition der Zahlen 0 bis 9. Dies ist dann natuerlich kein Zeichen sondern eine Zahl.

numbers_d = eval(numbers_f); 

Es gibt viele weitere MATLAB Befehle zum Suchen in Zeichenketten (strfind,regexp,strtok), zum Vergleichen (strcmp,strcmpi), zum Ersetzen (strrep,regexprep) und zu anderen Zwecken. Diese werden hier nicht im Detail besprochen.

Download

Sie koennen den File simplestring1.m im MatlabTutor selbst ausprobieren: Wechseln Sie dazu in Views auf die Workbench, erzeugen Sie in Projects einen neuen Folder (rechte Maustaste), erzeugen Sie dort einen neuen MATLAB-File und kopieren den Inhalt aus dem Browser mit Copy/Paste. Wenn sie sich direkt auf unseren Rechnern befinden, koennen sie den File auch direkt unter ComputingTutor/Projects/ in ihrem Homeverzeichnis speichern (oder in einem Unterverzeichnis davon) und finden ihn dann im View Workspace unter Projects.

Wie kann man 2 Strings vergleichen?

Möchte man dagegen die lexikalische Gleichheit zweier Strings prüfen, so kann dies u.a. mit der Methode equals() erfolgen. Sie ist in der Klasse Object deklariert und wird in der Klasse String überschrieben. Dort werden die beiden zu vergleichenden Strings als Arrays primitiver char -Typen behandelt.

Wie durchläuft man einen String?

Einen String durchlaufen mit For-Schleife Die Anzahl der Buchstaben c in einem String s sollen gezählt werden. Von Position 0 bis zum höchsten Index wird der String mit einer For-Schleife (auch Zählschleife genannt) durchlaufen.

Wie Länge darf ein String sein?

Während eine einzelne Zeichenfolge in Anführungszeichen nicht länger als 2048 Byte sein darf, kann durch Zeichenfolgenverkettung ein Zeichenfolgenliteral von ca. 65535 Bytes erstellt werden.

Was ist ein String Beispiel?

Ein String ist eine Zeichenkette. Der Datentyp String hat als Wertebereich die Menge aller Zeichenketten. Strings werden in Anführungszeichen gesetzt; Beispiele für Strings sind "abba", "Hallo Fritz!", "@%#&$", "x" sowie auch "". Die Länge eines Strings ist die Anzahl der Zeichen, aus denen er besteht.