实现字符串标记器的好方法(或者使用已经建立的)

A good way to implement a string tokenizer ( or use one that's already established )

本文关键字:建立 或者 方法 字符串 实现      更新时间:2023-09-26

我发现自己在一个情况下,我犯了两个新手错误之一:

  1. 编写我应该从库中取出的代码
  2. 编写超级复杂的代码,可以使用更好的模式大大简化

我想做的很简单,我需要向一些JavaScript代码发送指令,从对象打印字段到页面。事情开始很好,下面的字符串:

message, tags, date

很容易指示代码使用

从对象中获取这些元素
field_array = instruction_string.split(',')
obj['message'], obj['tags'], obj['date']

然后我意识到我想修改日期字段以反映我所在的时区。允许字符串携带字段的特殊指令增加了一点regex的复杂性,但仍然不是太复杂:

message, tags, date(GMT-5)

使用代码:

var special_instruction = /'(.*')/ig.exec('date(GMT-5)')[2]
RESULT: special_instruction = 'GMT-5'

当我意识到我还想告诉输出调整日期,使其反映从现在开始的时间增量,而不是打印实际日期时,我意识到我有点不知所措:

message, tags, date(GMT-5_)(SINCE_NOW)

我写的正则表达式不工作:

var special_instruction =  /'((.*)')/ig.exec('last_updated(GMT-5)(since_now)')
RESULT: special_instruction = 'GMT-5)(since_now'

虽然可能有一种方法可以修复正则表达式,但这表明我应该使用工具或已建立的模式来完成此操作,而不是在顶部编写自定义代码并长时间地使用它。

您确定要为此使用字符串和正则表达式吗?

另一种选择是使用数组和对象来定义应该打印的字段。

像这样:

var fields = [{
   name: 'message'
}, {
   name: 'tags'
}, {
   name: 'date',
   timezone: 'GMT-5',
   since: new Date() // now
}];

要从确定要打印的值中获取值,您可以遍历数组并查找name字段。如果您找到一个名称为date的对象,您可以查找其他属性。你也可以很容易地添加新的属性