关于Matlab:strtok函数的使用

Use of strtok function

基于MATLAB的strtok代码(请参见结尾):
"这是一个更高级的示例,该示例在字符串中找到第一个标记。标记是由空格或其他字符分隔的一组字符。给定一个输入,该函数将假定为默认的分隔符;给定两个,它使您可以如果需要,请指定另一个定界符。它还允许两个可能的输出参数列表"

我有几个问题:

1)是否在令牌的开头或结尾指定了定界符?

因此,例如,如果我想查找一段给我指定日期的文本部分,则整个文本是:"我喜欢4月10日,因为它接近"五一"。我以为令牌是" april 10",但起始定界符将是" a",而结束定界符将是数字?

您看到我对上下文中的"定界符"感到困惑。在MATLAB中,通常我可能会将令牌写为( w * s d *),以便在文本中定位日期(4月10日),因为我不知道日期是什么(以什么字母开头或以后面的数字)。但是,定界符是整个" 4月10日"还是只是一个" a"?如果我不知道是几月(4月,5月,6月等),或者它基本上只是作为"查找"命令而工作,这将有什么帮助?

我运行了图片中所示的程序,并尝试使用" hello my friend"作为字符串,并使用" o"作为分隔符,它给出了:
令牌=地狱
其余=我的朋友

因此,基本上我得到的印象分隔符通常是在字段的末尾或不同区域使用,以便指定何时开始新的字段/节(剩余部分)?基本上,定界符通常用作简单的一个(或可能更多)字符设备,以指示新字段或基准的开始,而使用(/d/w*....etc)格式用于更具体的提取,例如日期前面没有"逗号"或特定指示符的地方?这两个观察正确吗?

但是,当我使用" hello my fri"作为定界符运行它时(请参阅->使用定界符运行它,似乎可以随意选择"我想跟我的朋友好男人打个招呼"作为余数,选择" nd"作为标记)这没有任何意义,所以我想知道程序中是否有错误,或者是否没有设置它来处理出现两次的分隔符。

也,

2)有人可以解释一下为什么[9:13 32]被设置为一个输入参数的默认值吗?如果我们假设空白是定界符,那么[9:13 32]是什么意思?

3)使用" any"是有目的的,因为它是通过循环过程运行的?反正每次迭代都不会检查吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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

编辑:我不知道strtok是内置函数。我当时以为这是教科书正在构建的UDF为例。这就是为什么存在很多歧义的原因,因为本书没有明确说明函数的功能。

例如,这在文本中未指定,仅说明函数在字符串中找到了第一个标记。 ->令牌= strtok(str)从左到右解析输入字符向量str,返回令牌中部分或全部字符向量。使用空格字符作为分隔符,令牌输出从str的开头开始,跳过可能出现在开头的所有分隔符,并包括直到下一个分隔符或字符向量结尾的所有字符。空格字符包括空格(ASCII 32),制表符(ASCII 9)和回车符(ASCII 13)。

版权所有1984-2009 The MathWorks,Inc.


strtok非常不会在这里为您提供帮助,因此我不会回答您的主要问题。我认为您应该为此使用正则表达式,但我不会讲正则表达式,因此我将其留给其他人使用。

[9:13 32]

为什么默认分隔符设置为[9:13 32]。从评论中,MATLAB声称这些都是空白字符。换句话说,数字91011121332是空白字符的ASCII值。例如,32是空格的值。通过将其强制转换为整数来证明这一点:

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

我不知道其他所有字符,但是我很确定其中一个必须是制表符。要检查制表符的ASCII值,您可以执行

1
uint8(sprintf('\t'))

它返回确实在列表中的9

因此,正如注释所暗示的,[9:13 32]是所有空白字符的列表。

其实还有很多空白字符不会覆盖:https://en.wikipedia.org/wiki/Whitespace_character

任何

当您说any时,我假设您的意思是这样的:any(string(i) == delimiters)。因此,是的,循环确保一次只比较string的一个字符,但是delimiter中可以有多个值,例如上述所有空白字符,或者您可以这样调用strtok

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

现在'a''d'都用作分隔符,因此它返回

1
'I like the '

因为它先打'd'