何时使用术语“分隔符”、“终止符”和“分离器”

39

“定界符(delimiter)”,“终止符(terminator)”和“分隔符(separator)”这些词语的语义是什么?例如,我认为终止符会出现在每个标记之后,而分隔符则会在每个标记之间。一个定界符与这些中的任何一个相同,还是它们只是定界符的不同形式?

SO将它们三个都作为标签,但它们并不是彼此的同义词。这是因为它们实际上都是不同的吗?

10个回答

32

分隔符表示某物的限制,即其开始和结束的位置。例如:

"this is a string"

这里有两个分隔符,它们都是双引号字符。这些分隔符指示了哪部分属于这个东西,哪部分不属于。

一个分隔符用于区分序列中的两个元素:

one, two
1\t2
code();  // comment

分隔符的作用是将两个不同的实体划分开来,以便它们可以被区分。 (需要注意的是我说“两个”,因为在计算机科学中我们通常在处理线性字符序列)。

终止符表示序列的结束。在CSV中,您可以将换行符视为在一行上终止记录,或者将其视为将一条记录与下一条记录分隔开来。

令牌边界通常由语法类别的变化标记:

foo()

这段内容的翻译如下:

可能会被划分为word(foo), lparen, rparen这些标记,没有明确的定界符来区分这些标记,但是令牌化器(tokenizer)可以通过字母和标点符号之间的语法类别差异来识别它们。

这些类别并不完全相互独立。例如:

[red, green, blue]

根据你的语法,它可能是由三个项目构成的列表;方括号限定了列表,右括号终止了列表并标记了blue标记的结尾。

至于SO使用这些术语作为标签,它们只是用来指示问题主题的标签。标签没有一个单一统一的受控词汇表; 任何有足够声望的人都可以添加新的标签。存在足够的术语差异,以至于你永远无法在SO涵盖的所有主题中拥有一个单一受控的标签词汇表。


1
“分隔符”的定义与Wikipedia不一致。在那里,“分隔符”基本上涵盖了您所称的“分离器”。 - Jean-François Corbett
2
真的,但他的版本比维基百科上的更有意义。分隔符用于分隔事物(如“...”),分离器用于分离事物(如...,...)。谁曾经混淆了常见定义,让人们称分离器为“分隔符”,对任何人都没有好处。 - MSTM

23

从技术上讲,定界符用于分隔内容,以便告诉您一个字段何时结束并开始另一个字段,例如逗号分隔值(CSV)文件。

终止符位于某个内容的结尾,用于终止行/输入/任何内容。

分隔符可以是定界符或任何其他分隔内容的符号。例如,在英语单词之间的空格就是分隔符。

您可以认为换行符是行终止符、行的定界符或分隔两行内容的符号。因此,Unicode规范中有几种不同类型的换行符。


那么,分隔符和分离器有什么区别呢?你的解释似乎暗示了CSV中的逗号和英语中的空格都是分隔符和分离器,这正确吗? - musiphil
是的,它们最终具有几乎相同的含义。像在CSV文件中一样分隔字符串可以告诉您数据的限制在哪里。这些术语在广义上是等效的,尽管具有微妙的不同含义。Ian Dickinson的答案提供了更完整的差异解释。 - Ian Gilham

10

分隔符是用于标识某个东西的开始和结束的一个或两个标记。它们是必需的,因为我们不知道那个“东西”会有多长。我们可以使用:
1. 一个单一的分隔符,或者
2. 一对成对的分隔符

  • [a, b, c, d, e] 每个逗号 (,) 都是一个单一的分隔符。左右括号 ([, ]) 是成对的分隔符
  • "hello",这两个引号符号 (") 是成对的分隔符

分离器是“分隔符”的同义词,但从我的经验来看,它通常指的是字段分隔符。字段分隔符作为一个字段和其后面的字段之间的分隔符,因此被视为“将它们分开”的方式。

  • <file1>␜<file2>␜<file3>,文件分隔符字符 (),尽管名字明确带有“分隔符”,但它既是分隔符,又是分离器

终止符标记着一组事物的结尾,同样是因为我们不知道它有多长。

  • abdefa\0,这里的空字符 \0 是告诉我们字符串已经结束的终止符
  • foo\n,这里的换行符 \n 是告诉我们行已经结束的终止符

术语“分隔符”和“分离器”起源于存储的经典概念,概念上由文件、记录和字段组成 (一个文件有多个记录,每个记录有多个字段)。在这种情况下,单个分隔符和成对的分隔符可能被称为记录分隔符字段分隔符。由于文件-记录-字段分类法的历史重要性,这些术语具有更广泛的用途(参见维基百科关于分隔符的页面)。

  • 以下是两个文件,每个文件都有三个记录,每个记录有四个字段:

    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

换行符既是终止符(它们告诉我们字符串在哪里结束),也是分隔符(它们告诉我们每行的开头和结尾)。来自维基百科

有两种视角可以看待换行符,都是自洽的:一种是将其视为分隔行的标志,另一种是将其视为行的终止符。

当你只谈到一个单独的项目时(只涉及一个字符串1234\0、一个行abcd\n等),你只需要说“终止符”即可——在这种情况下不清楚终止符是否还能作为更复杂父结构中的分隔符。


3
这个回复是关于CSV的,因为所有提供的答案都集中在英语上。
“分隔符”是给定CSV规范中描述边界的所有元素,“分离器”是字段分隔符的常用名称,“终止符”是记录分隔符的常用名称。
分隔符是CSV格式规范的一部分,它定义了边界,并不一定是可打印字符。
终止符、分隔符和字段限定符都是分隔符,但不需要指定CSV格式,例如10列字段分隔符和30列记录分隔符意味着每30列为一条记录,每10列为一个字段(通常用空格填充)。换句话说,没有分隔符的CSV格式具有恒定的字段和记录长度,例如:
will      smith     1         chris     rock      0         

终止符是标记单个CSV记录结束的分隔符,通常由换行符(LF)、回车符(CR)或两者的组合(例如CRLF)表示,例如:

will      smith     1         
chris     rock      0         

分隔符是标记CSV字段之间分隔的定界符,通常用逗号(或分号)表示,引入它是为了存储动态长度的值,例如在CSV格式下使用两个逗号分隔记录,并在10之后使用CRLF终止符:

will,smith,1
chris,rock,0

字段限定符是一种分隔符,通常成对使用而不是转义序列。它是一个可打印字符,不允许在字段值中出现(除非给定的CSV格式规范提供了转义序列),并标记字段的开始和结束。它被引入以存储包含分隔符的值,例如此CSV具有每个记录3个字段的2个记录,但第3个字段值可能包含一个分号,否则会作为字段分隔符:

will;smith;"rich;famous;slaps people"
chris;rock;"rich;famous;gets slapped"

转义序列是一个字符(或一组字符),它标记紧随其后的任何内容为不重要,因此作为字段值的一部分(例如反斜杠可以指定紧随其后的分隔符作为值的一部分)。该序列可以转义一个或多个字符,例如,使用\作为1个字符转义序列的CSV:

will;smith;rich\;famous\;slaps people 100\\100% of time
chris;rock;rich\;famous\;slaps people 0\\100% of time

2
有趣的问题和答案。总结一下,1)分隔符标识了某些东西的“限制”,即开始和/或结束;2)终止符只是“结束分隔符”的特殊术语;3)分隔符意味着两边都有项目(不像分隔符)。
我能想到的最好的起始分隔符示例是编程语言中的起始注释标记(“#”,“//”等)。
我能想到的最好的终止符(结束分隔符)示例是Unix中的换行符。这是一个错误的名称 -- 它总是终止一个(可能为空的)行,但并不总是开始一个新行,即当它是文件中的最后一个字符时。也许一个更好的常见示例是简单的句号用于句子。
我能想到的最好的分隔符示例是简单的逗号。请注意,逗号在英语中从不单独出现,前后必须都有文本。
有趣的是,这些符号都不一定限于单个字符。实际上,在Unix中,awk(或者可能只有gawk?)允许FS(字段分隔符)为任何正则表达式。
此外,尽管在例如wc命令中,“任何非零量的空格”被认为是“单词分隔符”,但正则表达式中也有零宽度的“单词边界”指定符(例如\b)。有趣的是思考这样的零宽度项/边界是否也可以被视为“分隔符”。我倾向于认为不是(太过牵强)。

2

分隔符

delimiter有几种意义:

作为句子中使用的空间(边界)。 分隔符就像一个边界,它存在于国家之间。从这个意义上讲,必须有两个国家才能有边界。单词之间通常存在一个空格,但不在末尾。空格用于分隔单词,但不会终止句子(单词的集合)。例如:“This is a short sentence.”这个句子有四个空格,它们充当单词分隔符。实际上,通常没有命名的两个额外的分隔符:句子的开头和结尾。就像正则表达式中用于标记文本字符串的开始和结束的^$一样。此外,在人类语言中,还有标点符号(句点、逗号、分号、冒号等),它们也用作单词分隔符(除了空格)。
作为引用中使用的空间(边界)。 像这样的一句话:“This is a short sentence.”被双引号“”包围(开始和结束)。在这个意义上,它就像“平衡分隔符”(维基百科中的平衡括号)。
有人可能会认为“frontier”和“boundary”本质上是相同的,在某些情况下,他们确实是正确的。
分隔符与限定符(frontier)的第一种意义完全相同。
因此,在许多计算机应用中,“separator”是“delimiter”的同义词。
终止符用于标记单个“字段”的结尾。例如,在Unix文本文件中,每行都以换行符(\n)结尾。在正确的Unix文本文件中,所有行都被终止(即使是最后一行)。就像段落在人类语言中由换行符终止一样。
或者更严格地说,NUL(\0)是C字符串的终止符:
一个字符串被定义为由第一个零码单元(通常称为 NUL 码单元)终止的一系列代码单元。

因此,终止字符也是分隔符,但必须出现在末尾。

标签

Stackoverflow 仅针对分隔符和分离器设置标签

定界符是用于指定纯文本或其他数据流中独立区域之间边界的一个或多个字符序列。
分隔字符串部分的字符。

终止标签仅适用于 shell 终端模拟器:

Terminator 是一个 GPL 终端模拟器。

而且,是的,分隔符和分离器在很多情况下是等效的,
但除了圆括号、大括号、方括号和类似的平衡分隔符外。

2

在此已有的答案中,我使用了术语注释器

  • 注释符号的超集。
  • 注释器分隔符的超集。
  • 分隔符终止符分隔符的超集。

注释是文档中使用的所有符号和标记。例如,“TODO列表”文档必须是一行分隔的字符串列表。

符号是用于表示特定含义的标记。例如,“字符串在引号中”是一个符号。

分隔符是用于表示符号的字符或字符集。例如,引号字符是字符串的分隔符。

终止符是结束分隔符,前缀是开始分隔符。对于“TODO列表”文档,引号可以用作前缀和终止分隔符。

分隔符是分隔两个内容的分隔符。例如,“新行”是每个“TODO列表”项目的分隔符。在这个例子中,“新行”也是一个终止符;新行可以用于终止每一行。分隔符也可以是终止符,这是典型的,但不保证总是这样。

分隔符也可以是“定位”的。一个定位分隔的例子是列分隔的主机平面文件。


1
终止符是在空白处起到分隔作用。A;B;C;实际上是A;B;C;空白的简写形式。

1
就像英语一样,有技术上正确的答案和通常使用的答案,对于所寻求的术语定义的编程使用来说,将其隔离开可能是相关的。 长期以来,该行业一直使用“逗号分隔”文件一词来表示:
FirstRowFirstValue,FirstRowSecondValue,FirstRowThirdValue SecondRowFirstValue,SecondRowSecondValue,SecondRowThirdValue 从技术上讲,这是一个逗号“分隔”的列表。
从技术上讲,这是一个逗号“分隔”的列表。
,FirstRowFirstValue,FirstRowSecondValue,FirstRowThirdValue, ,SecondRowFirstValue,SecondRowSecondValue,SecondRowThirdValue,
或者这个:
,FirstRowFirstValue,,FirstRowSecondValue,,FirstRowThirdValue, ,SecondRowFirstValue,,SecondRowSecondValue,,SecondRowThirdValue,
没有人会这样做。 永远不会。
而行业标准是使用“文本限定符”作为“分隔符”的技术定义,其中(“)是“文本限定符”,(,)称为“分隔符”。

第一行第一个值,"第一行第二个值",第一行第三个值 第二行第一个值,第二行第二个值,第二行第三个值


0

"单词1","单词2" \NULL

  1. 这些单词由引号分隔,
  2. 由逗号分隔,
  3. 并以\NULL结束。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接