何时使用术语“分隔符”、“终止符”和“分隔符”
Posted
技术标签:
【中文标题】何时使用术语“分隔符”、“终止符”和“分隔符”【英文标题】:When to use the terms "delimiter," "terminator," and "separator" 【发布时间】:2012-02-25 11:42:10 【问题描述】:“分隔符”、“终结符”和“分隔符”这些词的使用背后的语义是什么?例如,我相信每个令牌之后都会出现一个终止符,每个令牌之间会出现一个分隔符。分隔符是否与其中任何一个相同,或者它们只是分隔符的形式?
SO 将这三个都作为标签,但它们不是彼此的同义词。这是因为它们都真的不同吗?
【问题讨论】:
【参考方案1】:分隔符表示事物的界限,它从哪里开始和在哪里结束。例如:
"this is a string"
有两个分隔符,这两个分隔符恰好都是双引号字符。分隔符表示事物的一部分,哪些不是。
分隔符区分序列中的两件事:
one, two
1\t2
code(); // comment
分隔符的作用是区分两个不同的实体,以便区分它们。 (请注意,我说“两个”是因为在计算机科学中我们通常谈论的是处理线性字符序列)。
终止符表示序列的结束。在 CSV 中,您可以将换行视为在一行中终止记录,或者将一条记录与另一条记录分开。
标记边界通常由语法类的变化来表示:
foo()
可能会被标记为word(foo)
、lparen
、rparen
- 标记之间没有任何明确的分隔符,但标记器会识别字母和标点字符之间语法类的变化。
类别并不完全不同。例如:
[red, green, blue]
可以(取决于您的语法)是三个项目的列表;括号分隔列表,右括号终止列表并标记blue
标记的结尾。
至于 SO 使用这些术语作为标签,它们只是:表示问题主题的标签。标签没有一个统一的受控词汇;任何有足够业力的人都可以添加新标签。术语上存在足够大的差异,以至于您永远不可能在 SO 涵盖的所有主题中拥有一个受控标签词汇表。
【讨论】:
这个“分隔符”的定义与Wikipedia's不一致。在那里,“分隔符”几乎涵盖了您所说的“分隔符”。 没错,但他的版本比***中的版本更有意义。分隔符分隔事物(例如“...”),分隔符分隔事物(例如...、...)。造成人们将分隔符称为“分隔符”的混淆通用定义的人对任何人都没有任何帮助。【参考方案2】:从技术上讲,分隔符用于事物之间,可能是为了告诉您一个字段在哪里结束,另一个字段在哪里开始,例如在逗号分隔值 (CSV) 文件中。
终结符出现在某事的末尾,终止行/输入/任何内容。
分隔符可以是分隔符或任何其他分隔事物的东西。以英语单词之间的空格为例。
您可能会争辩说换行符是行终止符、行分隔符或分隔两行的东西。出于这个原因,Unicode 规范中有一些不同的换行符类型。
【讨论】:
那么,分隔符和分隔符有什么区别呢?您的解释似乎暗示CSV中的逗号和英文中的空格都是分隔符和分隔符;这是正确的吗? 是的,它们最终具有几乎相同的含义。 CSV 文件中的分隔字符串告诉您数据的限制在哪里。这些术语大致相同,尽管含义略有不同。 Ian Dickinson 的回答对差异提供了更完整的解释。【参考方案3】:分隔符是一两个标记,用于显示某事物的开始和结束。之所以需要它们,是因为我们不知道那个“东西”会持续多久。我们可以有: 1. 单个分隔符,或 2. 一对pair-delimiters
[a, b, c, d, e]
每个逗号 (,
) 是一个单个分隔符。左右括号 ([
, ]
) 是 pair-delimiters。
"hello"
,两个引号 ("
) 是 pair-delimiters
分隔符是“分隔符”的同义词,但根据我的经验,它通常指的是字段分隔符。字段分隔符充当一个字段与其后一个字段之间的分隔符,这就是为什么可以将其视为“分隔”它们的原因。
<file1>␜<file2>␜<file3>
,文件分隔符 (␜
),尽管名称明确包含“分隔符”,但它既是 分隔符 也是 分隔符
终结者标志着一组事物的结束,再次需要它,因为我们不知道它有多长。
abdefa\0
,这里的空字符\0
是一个终止符,它告诉我们字符串已经结束。
foo\n
,这里的换行符 \n
是一个 终止符,它告诉我们该行已经结束。
术语、定界符、分隔符源于经典的存储思想,从概念上讲,由文件、记录和字段组成,(一个文件有很多记录,一个记录有很多字段)。在这种情况下,单个分隔符和成对分隔符可能被称为记录分隔符和字段分隔符。由于 files-records-field 分类法的历史意义,该术语具有更广泛的用途(参见 Wikipedia page for Delimiter)。
下面是两个文件,每个文件有三个记录,每个记录有四个字段:
martin,rodgers,33,28000\n
timothy,byrd,22,25000\n
marion,summers,35,37000\n
===
lucille,rowe,28,33000\n
whitney,turner,24,19000\n
fernando,simpson,35,40900\n
这里,我们知道,
和\n
是单个分隔符,但它们也可以分别称为记录分隔符和字段分隔符。
对于复杂的嵌套结构,终止符也可以是分隔符/分隔符(它们不是互斥的定义)。在前面的示例中,文件内部的 ===
标记可以被视为终止符(它是文件的结尾)。但是当我们查看许多文件时,===
就像一个分隔符/分隔符。
考虑 UNIX 文件中的行
This is line 1\n
This is line 2\n
This is line 3\n
换行符既是终止符(它们告诉我们字符串在哪里结束),也是分隔符(它们告诉我们每行的开始和结束位置)。来自Wikipedia:
两种方式来查看换行符,这两种方式都是自洽的,换行符要么分隔行,要么终止行。
真的,当你在谈论一个单独的项目时,你只需要说“终结者”,(只有一个字符串1234\0
,只有一行abcd\n
,等等)——这会不清楚此上下文中的终止符是否也可以是更复杂父结构中的分隔符。
【讨论】:
【参考方案4】:此响应是在 CSV 上下文中,因为所有提供的答案都集中在英语上。
分隔符是给定 CSV 规范中提到的所有元素,用于描述内容的边界,分隔符是字段分隔符的通用名称,终止符 是记录分隔符的通用名称。
分隔符是 CSV 格式规范的一部分,它定义边界并且不必是可打印字符。
终结符、分隔符和字段限定符是分隔符,但不是指定 CSV 格式所必需的,例如50 列分隔符意味着每 50 列是一个值 - 每行中 0-49 的字符(通常用空格填充)是 field0 的值,50-99 的字符是 field1 的值,等等。
终止符是一个分隔符,通常由换行符 (LF
)、回车符 (CR
) 或组合表示(例如 CRLF
),并标记单个 CSV 记录的结束。
分隔符是一个分隔符,由打印字符(例如分号)表示并标记 CSV 字段之间的分隔,它已被引入用于存储动态长度值。不带分隔符的 CSV 格式规范通常具有恒定的字段长度。
字段限定符是通常成对使用而不是转义序列的分隔符,它是字段值中不允许出现的可打印字符(除非给定的 CSV 格式规范提供了转义序列)并标记了开始和结束一个字段,它被引入来存储包含分隔符的值。
转义序列是一个字符(或一组字符),它将转义序列后面的任何内容标记为不重要,因此作为字段值的一部分(例如,反斜杠可能将紧随其后的分隔符指定为价值)。此序列可以转义一个或多个字符。
【讨论】:
【参考方案5】:有趣的问题和答案。总而言之,1)定界符标志着事物的“界限”,即开始和/或结束; 2)终止符只是“结束分隔符”的一个特殊术语; 3) 分隔符意味着它的两边都有项目(与分隔符不同)。
我能想到的开始分隔符的最佳示例是编程语言中的开始注释标记(“#”、“//”等)。
我能想到的终止符(结束分隔符)的最佳示例是 Unix 中的换行符。这是用词不当——它总是终止一个(可能是空的)行,但并不总是开始一个新行,即当它是文件中的最后一个字符时。也许更常见的例子是句子的简单句号。
我能想到的分隔符的最佳示例是简单的逗号。请注意,逗号在英文中永远不会出现前后都没有文字的情况。
有趣的是,这些都不一定限于单个字符。事实上,Unix 中的 awk(或者可能只是 gawk?)允许 FS(字段分隔符)成为任何正则表达式。
此外,尽管“任何非零数量的空格”在例如wc 命令,在正则表达式中也有零宽度的“字边界”说明符(例如 \b)。有趣的是,思考这样的零宽度项目/边界是否也可以被视为“分隔符”。我倾向于不认为(太过分了)。
【讨论】:
【参考方案6】:当您以空开头时,终结符是分隔符。 A;B;C;实际上是 A;B;C;空。
【讨论】:
【参考方案7】:“单词 1”、“单词 2”\NULL
-
单词用引号分隔,
以逗号分隔,
整个事情被 \NULL 终止。
【讨论】:
【参考方案8】:分隔符
delimiter
有几种感觉:
作为句子中使用的空间(边界)。
分隔符就像一个边界,它exists between countries。
从这个意义上说,必须有两个国家才能有边界。
单词之间通常存在空格,但结尾处不存在空格。空格分隔单词但不terminate
句子(单词集合)。句子:
这是一个简短的句子。
有四个空格,它们充当单词分隔符。没有结尾空格。
事实上,还有两个额外的定界符通常没有命名:句子的开头和结尾。就像在正则表达式中使用的^
和$
来标记文本字符串的开始和结束。
而且,在人类语言中,标点符号(点、逗号、分号、冒号等)也可用作单词分隔符(除了空格)
在引号(边界)中使用。 像这样的一句话:
“这是一个简短的句子。”
是delimited
(开始和结束)由双引号(“”
)。从这个意义上说,它就像“平衡分隔符”(Balanced Brackets in Wikipedia)。
有些人可能认为frontier
和边界本质上是相同的,并且在某些情况下它们实际上是正确的。
分隔符
与分隔符(边界)的第一义(上)完全相同。
因此,separator
是许多计算机用途中分隔符的同义词。
终结者
划定单个“字段”的末端。
就像 Unix 文本文件中的换行符一样。每行都以 NewLine (\n
) 结束。
在适当的 Unix 文本文件中,所有行都被终止(甚至是最后一行)。
类似的段落以人类语言的换行符结束。
或者,more strictly,因为 NUL (\0
) 是 terminator of a C string:
字符串被定义为由第一个零代码单元(通常称为 NUL 代码单元)终止的连续代码单元序列。
因此,终止符也是分隔符,但必须也出现在末尾。
标签
*** 的标签仅用于分隔符和分隔符
delimiter分隔符是一个或多个字符的序列,用于指定纯文本或其他数据流中单独、独立区域之间的边界。separator分隔字符串各部分的字符。
终结符标签仅适用于 shell 终端仿真器:
terminatorTerminator 是一个 GPL 终端仿真器。
而且,是的,分隔符和分隔符多次等效除了括号、大括号、方括号和类似的平衡分隔符。
【讨论】:
【参考方案9】:就像英语一样,有技术上正确的答案和普遍使用的答案,并且可能与所寻求的术语定义的编程用法相关。
业界长期以来一直使用短语“逗号分隔”文件来表示:
FirstRowFirstValue,FirstRowSecondValue,FirstRowThirdValue SecondRowFirstValue,SecondRowSecondValue,SecondRowThirdValue
从技术上讲,这是一个逗号“分隔”的列表。
从技术上讲,这是一个逗号“分隔”列表。
,FirstRowFirstValue,FirstRowSecondValue,FirstRowThirdValue, ,SecondRowFirstValue,SecondRowSecondValue,SecondRowThirdValue,
或者这个:
,FirstRowFirstValue,,FirstRowSecondValue,,FirstRowThirdValue, ,SecondRowFirstValue,,SecondRowSecondValue,,SecondRowThirdValue,
没有人这样做。永远。
行业标准是使用“TEXT QUALIFIER”作为“DELIMITER”的技术定义,其中 (") 是“TEXT QUALIFIER”,(,) 称为“DELIMITER”。
FirstRowFirstValue,"第一行第二值",FirstRowThirdValue SecondRowFirstValue,SecondRowSecondValue,SecondRowThirdValue
【讨论】:
以上是关于何时使用术语“分隔符”、“终止符”和“分隔符”的主要内容,如果未能解决你的问题,请参考以下文章