【发布时间】:2013-11-23 22:49:33
【问题描述】:
我正在创建一个语法荧光笔,并且我正在使用 String.split 从输入字符串创建标记。 第一个问题是 String.split 会创建大量的空字符串,这会导致一切都比原本可能的速度慢很多。
例如,"***".split(/(\*)/) -> ["", "*", "", "*", "", "*", ""]。
有没有办法避免这种情况?
另一个问题是正则表达式本身的表达式优先级。
假设我正在尝试解析 C 风格的多行注释。
即/* comment */。
现在让我们假设输入字符串是"/****/"。
如果我使用以下正则表达式,它会起作用,但会产生很多额外的标记(以及所有那些空字符串!)。
/(\/\*|\*\/|\*)/
更好的方法是读取/*、*/,然后在一个令牌中读取所有其余的*。
也就是说,上述字符串的更好结果是["/*", "**", "*/"]。
但是,当使用应该这样做的正则表达式时,我得到了不好的结果。
正则表达式是这样的:/(\/\*|\*\/|\*+)/。
这个表达式的结果是:["/*", "***", "/"]。
我猜这是因为最后一部分是贪婪的,所以它从另一部分窃取了比赛。
我找到的唯一解决方案是制作一个否定的前瞻表达式,如下所示:
/(\/\*|\*\/|\*+(?!\/)/
这给出了预期的结果,但与另一个相比它很慢,这对大字符串有影响。
这些问题有解决方案吗?
【问题讨论】:
-
"****".split().join().split('');我知道这可能不是你需要的。但似乎有效。
标签: javascript regex split tokenize