2016-06-03 14 views
0

Basierend auf MATLAB-Code für strtok (siehe Ende): "Hier ist ein fortgeschritteneres Beispiel, das das erste Token in einer Zeichenfolge findet. Ein Token ist eine Reihe von Zeichen durch Leerzeichen oder ein anderes Zeichen begrenzt. gegeben ein Eingang, übernimmt die Funktion ein Standardtrennzeichen von Leerzeichen, bei zwei, es kann Sie ein anderes Trennzeichen angeben, falls gewünscht es ermöglicht auch zwei mögliche Ausgabeargumente Listen“Verwendung der STRTOK-Funktion

ich habe ein paar Fragen:

1.) Ist ein Begrenzer am Anfang oder Ende eines Tokens angegeben?

So zum Beispiel, wenn ich den Abschnitt eines Textes finden wollte, der mir ein bestimmtes Datum gab und der ganze Text war: "Ich mag das Datum 10. April, weil es nah an Maifeiertag ist". Ich stelle mir vor, dass der Token "April 10" ist, aber der Startbegrenzer wäre "a" und der Endbegrenzer wäre eine Ziffer?

Sie sehen, ich bin verwirrt, was ein "Begrenzer" ist genau im Zusammenhang. In MATLAB würde ich normalerweise das Token als (\ w * \ s \ d *) schreiben, um das Datum (10. April) im Text zu finden, da ich nicht weiß, um welches Datum es sich handelt (mit welchem ​​Buchstaben es beginnt oder) die Ziffern danach). Aber ist ein Trennzeichen das ganze "April 10" oder nur ein "a" am Anfang? Wie würde das helfen, wenn ich nicht weiß, welcher Monat es ist (April, Mai, Juni, usw.) oder funktioniert es im Grunde nur als ein "Finde" Befehl?

lief ich das Programm im Bild gezeigt und versucht, es mit ‚Hallo mein Freund‘ als String und ‚o‘ als Trennzeichen und es gibt: token = Hölle Rest = o mein Freund

So Grundsätzlich bekomme ich den Eindruck, dass Begrenzer am Ende von Feldern oder verschiedenen Regionen verwendet werden, um festzulegen, wann das neue Feld/Abschnitt (Rest) beginnt? Grundsätzlich wird ein Delimiter üblicherweise als einfaches (oder mehr) Zeichengerät verwendet, um den Beginn eines neuen Feldes oder Datums anzuzeigen, während das Format (/d/w*.........) für spezifischere Extraktionen wie Daten verwendet wird wo gibt es kein "Komma" oder einen bestimmten Indikator davor? Sind diese beiden Beobachtungen richtig?

ABER dann, wenn ich laufe es „hallo meinen fri“ als Trennzeichen verwenden (siehe ->running it with delimiter, so scheint es beliebig wählen als den Rest und „nd“ „Ich hallo meinen Freund guten Mann sagen will“ als Token, das ich keinen Sinn, so frage mich, ob es ein Fehler in diesem Programm oder wenn es nur nicht eingerichtet zu handhaben ein Trennzeichen, das zweimal erscheinen läßt.

auch

2) Kann jemand Bitte erläutern Sie, warum [9:13 32] als Standard für ein Eingabeargument festgelegt wurde. Wenn wir davon ausgehen, dass Whitespace das Delimiter ist, was bedeutet das dann [9:13 32]?

3) Gibt es irgendeinen Zweck für die Verwendung von "any", da es von einem Schleife Prozess ausgeführt wird? Würde es nicht jede Iteration überprüfen?

function [token, remainder] = strtok(string, delimiters) 
%STRTOK Find token in string. 
% TOKEN = STRTOK(STR) returns the first token in the string STR delimited 
% by white-space characters. STRTOK ignores any leading white space. 
% If STR is a cell array of strings, TOKEN is a cell array of tokens. 
% 
% TOKEN = STRTOK(STR,DELIM) returns the first token delimited by one of 
% the characters in DELIM. STRTOK ignores any leading delimiters. 
% Do not use escape sequences as delimiters. For example, use char(9) 
% rather than '\t' for tab. 
% 
% [TOKEN,REMAIN] = STRTOK(...) returns the remainder of the original 
% string. 
% 
% If the body of the input string does not contain any delimiter 
% characters, STRTOK returns the entire string in TOKEN (excluding any 
% leading delimiter characters), and REMAIN contains an empty string. 
% 
% Example: 
% 
%  s = ' This is a simple example.'; 
%  [token, remain] = strtok(s) 
% 
% returns 
% 
%  token = 
%  This 
%  remain = 
%  is a simple example. 
% 
% See also ISSPACE, STRFIND, STRNCMP, STRCMP, TEXTSCAN. 

% Copyright 1984-2009 The MathWorks, Inc. 

if nargin<1 
    error(message('MATLAB:strtok:NrInputArguments')); 
end 

token = ''; remainder = ''; 

len = length(string); 
if len == 0 
    return 
end 

if (nargin == 1) 
    delimiters = [9:13 32]; % White space characters 
end 

i = 1; 
while (any(string(i) == delimiters)) 
    i = i + 1; 
    if (i > len), 
     return, 
    end 
end 

start = i; 
while (~any(string(i) == delimiters)) 
    i = i + 1; 
    if (i > len), 
     break, 
    end 
end 
finish = i - 1; 

token = string(start:finish); 

if (nargout == 2) 
    remainder = string(finish + 1:length(string)); 
end 

EDIT: war mir nicht bewusst, dass strtok eine integrierte Funktion war. Ich ging davon aus, dass es ein UDF war, das das Lehrbuch als Beispiel aufbaute. Aus diesem Grund gibt es viele Unklarheiten, da das Buch nicht klar angibt, was die Funktion macht.

Dies wurde zum Beispiel nicht im Text angegeben, der nur die Funktion gefunden hat, die das erste Token in einer Zeichenkette gefunden hat.-> token = strtok (str) analysiert den Eingabezeichenvektor str von links nach rechts und gibt einen Teil oder den gesamten Zeichenvektor in token zurück. Wenn Sie das Leerzeichen als Trennzeichen verwenden, beginnt die Token-Ausgabe am Anfang von str. Dabei werden alle Trennzeichen übersprungen, die am Anfang erscheinen könnten, und alle Zeichen bis zum nächsten Trennzeichen oder zum Ende des Zeichenvektors eingeschlossen. Leerraumzeichen umfassen Leerzeichen (ASCII 32), Registerkarten (ASCII 9) und Wagenrücklaufzeichen (ASCII 13).

Urheberrecht 1984-2009 The MathWorks, Inc.

+2

Bitte schreiben Sie den Code als Test und kein Bild – Dan

+0

Ich glaube nicht, dass "strtok" ist die Funktion, die Sie dafür wollen. Ich bin mir ziemlich sicher, dass du 'April 10' nicht mit einem Aufruf von' strtok' extrahieren kannst. Sie können möglicherweise ein Datum der Form "mmmm dd" mit etwas wie regulären Ausdrücken extrahieren. 'strtok' wird Ihre Zeichenfolge in zwei Teile aufteilen, alles vor dem Begrenzer und alles danach. Wenn dein Begrenzer also "a" wäre, dann würdest du "Ich mag den d'' (lol) als dein Token "und" aß den 10. April, weil es nahe am 1. Mai ist "als den Rest. – Dan

+3

[Bitte nicht Bilder des Codes posten. Fügen Sie sie stattdessen in die Antwort ein.] (Http: //meta.stackoverflow.com/questions/285551/why-may-ich-nicht-upload-images-of-code-auf-so-wenn-fragen-eine-frage) –

Antwort

0

strtok ist sehr viel wollen Sie hier nicht helfen, so dass ich Ihre Hauptfrage geht nicht zu antworten. Ich denke, du solltest dafür regulären Ausdruck verwenden, aber ich rede nicht, also überlasse ich das jemand anderem.

[9.13 32]

Warum ist die Standardtrennzeichen gesetzt [9:13 32]. Aus den Kommentaren behauptet MATLAB, dass das alles Leerzeichen sind. Mit anderen Worten, dann sind die Nummern 9, 10, 11, 12, 13 und 32 die ASCII-Werte für Leerraumzeichen. Zum Beispiel ist 32 der Wert eines Space. Beweisen Sie, dass diese sich von einem auf eine ganze Zahl Gießen:

uint8(' ') % or even ' ' + 0 

Ich weiß nicht, was alle anderen sind, aber ich bin ziemlich sicher, dass man das Tab-Zeichen sein muss. den ASCII-Wert eines Tab-Zeichen überprüfen Sie

uint8(sprintf('\t')) 

die 9 zurück, die in der Liste ist in der Tat tun.

Also [9:13 32] ist eine Liste aller Leerzeichen, wie der Kommentar impliziert.

Eigentlich gibt es viele weitere Leerzeichen, die diese gehören nicht: https://en.wikipedia.org/wiki/Whitespace_character

jede

Wenn Sie any sagen, ich nehme an, Sie in Zeilen wie diese bedeuten: any(string(i) == delimiters). Also ja, sorgt für die Schleife, dass nur ein Zeichen von string zu einer Zeit verglichen wird, jedoch kann es in delimiter zum Beispiel alle Leerzeichen mehrere Werte sein, wie oben erwähnt oder vielleicht genannt Sie strtok wie folgt aus:

strtok('I like the date...', 'ad') 

beide jetzt 'a' und 'd' werden als Trennzeichen verwendet, und so gibt es

'I like the ' 

, weil es ein 'd' zuerst getroffen.

+0

strtok ist keine eingebaute Funktion, sondern ein UDF erstellt. Ich habe den Code und danke für die Antwort in Bezug auf "alle" – masque

+0

@masque gut, dass UDF bemerkenswert ist, die MATLAB Built-in-Code (die ich auf Ihre Frage geschrieben), das meiste davon ist Linie für Linie identisch ... warum würde Sie verwenden eine UDF für 'strtok'? – Dan

+0

Vergiss mein schlechtes. Ich habe diesen Code aus einem Lehrbuch erhalten und ich benutzte STRTok war ein Beispiel für eine UDF. Ich war mir nicht bewusst, dass es auch eine eingebaute Funktion war. Ich stimme auch zu, ich hätte Regexp verwendet, wie ich damit vertraut bin, aber ich war mir nicht sicher, die Anwendung von strtok – masque

Verwandte Themen