strtok函数的使用

Use of strtok function

基于 strtok 的 MATLAB 代码(见结尾): "Here’s a more advanced example that finds the first token in a character string. A token is a set of characters delimited by whitespace or some other character. Given one input, the function assumes a default delimiter of whitespace; given two, it lets you specify another delimiter if desired. It also allows for two possible output argument lists"

我有几个问题:

1) 分界符是在token的开头还是结尾?

因此,例如,如果我想找到给定日期的文本部分,而整个文本是:"I like the date april 10 because it is close to May Day"。我想令牌是 "april 10" 但起始定界符是 "a" 而结束定界符是数字?

你看,我对 "delimiter" 在上下文中的确切含义感到困惑。在 MATLAB 中,我通常可能会将标记写为 (\w*\s\d*) 以便在文本中找到日期(4 月 10 日),因为我不知道它是什么日期(它以什么字母开头或后面的数字)。但是分隔符是整个 "april 10" 还是只是一个 "a" 开头?如果我不知道现在是几月(四月、五月、六月等)或者它基本上只是作为 "find" 命令工作,这会有什么帮助?

我 运行 图片中显示的程序并尝试使用 'hello my friend' 作为字符串和 'o' 作为分隔符,它给出: 代币=地狱 余数=我的朋友

所以基本上我得到的印象分隔符通常用于字段或不同区域的末尾,以指定新的 field/section(剩余部分)何时开始?基本上,定界符通常用作简单的一个(或多个)字符设备来指示新字段或数据的开始,而使用 (/d/w*....etc) 格式用于更具体的提取,例如dates里面没有"comma"或者前面有具体的指标吗?这两个观察是否正确?

BUT 然后当我 运行 它使用 "hello my fri" 作为分隔符(见 --> running it with delimiter,它似乎是任意 select "I want to say hello my friend good man" 作为余数,"nd" 作为令牌,这毫无意义所以我想知道这个程序中是否存在错误,或者它是否没有设置为处理出现两次的定界符.

此外,

2) 谁能解释一下为什么 [9:13 32] 是一个输入参数的默认设置?如果我们假设 whitespace 是分隔符,那么 [9:13 32] 是什么意思?

3) 使用 "any" 是否有任何目的,因为它是循环过程中的 运行?无论如何,它不会在每次迭代时检查它吗?

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 作为示例。这就是为什么有很多歧义的原因,因为这本书没有明确说明该功能的作用。

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

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

strtok 在这里对您帮助不大,所以我不会回答您的主要问题。我认为你应该为此使用正则表达式,但我不会说正则表达式,所以我会把它留给其他人。

[9:13 32]

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

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

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

uint8(sprintf('\t'))

哪个returns 9确实在列表中

所以 [9:13 32] 是所有白色 space 字符的列表,正如评论所暗示的那样。

实际上还有更多的白色 space 字符未涵盖:https://en.wikipedia.org/wiki/Whitespace_character

任意

当您说 any 时,我假设您的意思是这样的行:any(string(i) == delimiters)。所以是的,循环确保一次只比较 string 的一个字符,但是 delimiter 中可以有多个值,例如上面提到的所有白色 space 字符或者你像这样称呼 strtok

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

现在 'a''d' 都用作分隔符,因此 returns

'I like the '

因为它首先击中了 'd'