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 字符。换句话说,数字 9
、10
、11
、12
、13
和 32
是白色的 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'
。
基于 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 字符。换句话说,数字 9
、10
、11
、12
、13
和 32
是白色的 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'
。