Use of strtok function
基于MATLAB的
"这是一个更高级的示例,该示例在字符串中找到第一个标记。标记是由空格或其他字符分隔的一组字符。给定一个输入,该函数将假定为默认的分隔符;给定两个,它使您可以如果需要,请指定另一个定界符。它还允许两个可能的输出参数列表"
我有几个问题:
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.
[9:13 32]
为什么默认分隔符设置为
1 |
我不知道其他所有字符,但是我很确定其中一个必须是制表符。要检查制表符的ASCII值,您可以执行
它返回确实在列表中的
因此,正如注释所暗示的,
其实还有很多空白字符不会覆盖:https://en.wikipedia.org/wiki/Whitespace_character
任何
当您说
1 |
现在
1 | 'I like the ' |
因为它先打