JS中高效的字符串解析:如何创建不分配新字符串的子字符串
Efficient string parsing in JS: How to create a substring which does not allocate a new string
我有大消息通过websocket,我想用正则表达式解析(为了简单)。
正则表达式识别报头的格式,在读取长度字段后,我们就知道下一个片段在哪里,然后我可以在该部分上运行正则表达式。
然而,由于我的整个消息可能很大(比如…)10MB),由许多片段组成(比如…1000,其中平均段长度略低于1K),然后天真地将主消息切片以将其传递回下一个位置的re.exec()
,这似乎会导致大量的GC抖动,如果不是为原始字符串内容分配千兆字节的话。
我想知道是否有任何正则表达式相关的函数允许我指定索引开始运行正则表达式?exec
和search
不允许我这样做。
ES6在regexp上定义了一个"sticky"标志,允许检查字符串是否在特定位置以regexp开头:
var position = 3;
var string = "la-la-la";
var re = /'d+/y;
re.lastIndex = position;
var match = re.exec(string);
//... do something with match
关于这个有一个讨论:http://esdiscuss.org/topic/proposal-for-exact-matching-and-matching-at-a-position-in-regexp
我忘记了RegExp.prototype.exec
为您处理这个,所以您只需继续传递原始字符串,它只会从最后停止的地方开始搜索。
这对我来说并不完全理想,因为它做了一大堆额外的解析,而不是我需要它(它将解析整个片段的内容),虽然。我想我可以把lastIndex
向前推进。
是的,有一种方法,但不是通过函数的参数。相反,您可以利用RegExp对象的.lastIndex
属性(它需要具有全局标志集)。match
, replace
, exec
和test
方法将尊重此值。
var re = /header:…length:('d+)/g;
for (var m; m=re.exec(re); ) {
var len = parseInt(m[1], 10);
re.lastIndex += len;
…
}
相关文章:
- 从字符串创建dom元素时添加多个类
- 如何使用字符串创建空的JSON键(是否嵌套)
- 从从字符串创建的函数中获取参数列表
- 如何从带有多个对象的JSON字符串创建JSON对象
- 从字符串创建 JavaScript 函数
- 从XML字符串创建DOM元素,如何使用.getElementsByName()
- 使用 eval 从字符串创建函数的不同方法
- javascript从字符串创建不区分大小写的regex
- PhantomJS从字符串创建页面
- 从任何jquery选择器字符串创建元素的最有效方法
- 是否可以使用HTML从任意字符串创建Jquery对象,例如var$newlink=$('<a>新链接
- 从 JSON 字符串创建的 knockoutjs observableArray 中的未定义(额外)对象
- 奇怪的日期()是用包含空字节的字符串创建的
- 如何使用以 js 为单位递增的字符串创建 for 循环变量
- 如何在 Java 脚本中从字符串创建对象树
- 按字符串创建对象
- jQuery 访问从字符串创建的元素
- 如何从另一个长字符串创建最多 12 个字符的加密字符串
- 从字符串创建的 Javascript 正则表达式 - 为什么它不起作用
- jquery 查询字符串创建问题