这是一个解决方案:
function tokenize(str) {
var reg = /((\\.|[^\\:])*)/g;
var array = [];
while(reg.lastIndex < str.length) {
match = reg.exec(str);
array.push(match[0].replace(/\\(\\|:)/g, "$1"));
reg.lastIndex++;
}
return array;
}
它根据字符将字符串拆分为标记:
。
- 但是,如果您希望它成为令牌的一部分,您可以转义
:
字符。\
- 如果您希望它成为令牌的一部分,您可以逃避
\
with\
- 任何其他
\
都不会被解释。(即:\a
遗骸\a
)
- 因此,只要事先正确格式化数据,您就可以将任何数据放入令牌中。
这是一个带有字符串的示例\a:b:\n::\\:\::x
,它应该给出这些标记:\a
, b
, \n
, <empty string>
, \
, :
, x
。
>>> tokenize("\\a:b:\\n::\\\\:\\::x");
["\a", "b", "\n", "", "\", ":", "x"]
为了更清楚:放入标记器的字符串将被解释,它有2个特殊字符:\
和:
\
只有在\
or之后才具有特殊含义:
,并且将有效地“转义”这些字符:这意味着它们将失去对标记器的特殊含义,并且它们将被视为任何普通字符(因此将成为标记的一部分)。
:
是分隔 2 个标记的标记。
我意识到 OP 没有要求斜线转义,但其他查看者可能需要一个完整的解析库,允许数据中的任何字符。