代码之家  ›  专栏  ›  技术社区  ›  Pearly Spencer Paul Cruz

标记化分析选项

  •  1
  • Pearly Spencer Paul Cruz  · 技术社区  · 8 年前

    考虑一个稍微不同于我的玩具例子 previous question 以下内容:

    . local string my first name is Pearly,, and my surname is Spencer
    
    . tokenize "`string'", parse(",,")
    
    . display "`1'"
    my first name is Pearly
    
    . display "`2'"
    ,
    
    . display "`3'"
    ,
    
    . display "`4'"
    and my surname is Spencer
    

    我有两个问题:

    1. tokenize 在这种情况下按预期工作?我以为是局部宏观的 2 应该是 ,, 而不是 , 当局部宏 3 包含字符串的其余部分(和本地宏 4 为空)。

    2. 有强制的方法吗 标记化 把双逗号当作语法分析 性格?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Nick Cox    8 年前

    tokenize --和 gettoken 我也不会接受 重复的 字符,如 ,, 作为一个 混合成的 正在分析字符。 ,, 作为解析字符的规范不是非法的,但被理解为 , ,请 是可接受的分析字符。实践中的重复被忽略了,就像在“我的名字是珍珠”后面加上“我的名字是珍珠”一样,不会在对话中添加信息。

    备份:知道没有其他指示(如 syntax 命令)stata将根据空格分析字符串,除了双引号(或复合双引号)比空格分开更难绑定。

    标记化 --和 葛托肯 太--将接受多个分析字符 PChars公司 以及帮助 标记化 用空格和 + 签字。(根据我的经验,想要使用空格和逗号更为常见 ,请 当命令的语法不完全是什么时 语法 完全解析。)

    空间和其他解析字符之间的区别在于,空间被丢弃,但其他解析字符不会被丢弃。这里的基本原理是,这些字符通常具有您可能想要向前推进的含义。因此,在为命令选项设置语法时,您可能希望允许 myoption( 变量名 [ ,请 子选项 ] ) 因此,逗号是否存在以及后面的其他内容对于以后的代码很重要。

    使用复合字符,以便 ,, 作为分隔符,我认为您需要使用 substr() 或同等产品。实际上,一个更简单的解决方法可能是首先用一些中性的单个字符替换复合字符,然后应用 标记化 .这可能需要依赖于知道中性字符不应该以其他方式出现。因此我经常使用 @ 作为字符占位符,因为我知道它不会作为变量名或标量名的一部分出现,也不是函数名或运算符的一部分。

    就其价值而言,我在第一篇文章中注意到 split 我允许组合字符作为分隔符。我记得,引发这一问题的一个因素是关于statalist的一个问题,它是关于法律案件的数据,在 VS (对)指出哪一方是哪一方。这个例子保存在官方命令的帮助中。

    什么是“严重的”错误,很大程度上取决于判断。我认为程序员只要尝试一下,就会发现复合字符不能按预期工作。 标记化 在像你这样的情况下。

    推荐文章