2

我需要一些 Regexp 对象的 Python 方法的模拟 - 搜索。它具有三个参数:文本、开始位置和结束位置,并返回具有开始和结束字段的 Match 对象。

我有一个函数,它返回 Match 对象,但我不知道如何在这个函数中实现 endIndex。我担心性能并且非常不愿意使用子字符串方法。在我的情况下,是否有可以在 Javascript 中使用的功能?另一个问题是有没有提供类似于 Python re 模块的 API 的库?

   function search(str, startIndex, endIndex) {
    var re = new RegExp(this.matcher.source, 'g' + (this.matcher.ignoreCase ? 'i' : '') + (this.matcher.multiLine ? 'm' : ''));

    re.lastIndex = startIndex || 0;
    var value = re.exec(str);

    if (!value)
        return null;

    var start = re.lastIndex - value[0].length;
    var end = re.lastIndex;

    return new Match(start, end);
}
4

1 回答 1

2

由于 javascript RegExp 对象不提供任何内置的子字符串功能,并且 javascript 不允许任何指针魔术,因此您别无选择,只能使用子字符串。但是,除非您期待巨大的字符串,否则我不会太担心子字符串的性能。Substring 基本上是一个内存副本,它在硬件级别是一个令人难以置信的优化操作(想想 L1-3 缓存、允许每个时钟周期复制 128 位的 cpu 扩展等)。

只是为了我的娱乐,我提供了一些创造性的替代子字符串:

  1. 保留您的 lastIndex 技巧,但将 `.{m, n}$' 添加到正则表达式的末尾:

    • 让。m_str.length - endIndex
    • 让我们n成为 str.length - lastIndex
  2. 使用用 javascript 编写的具有内置子字符串扫描的正则表达式引擎。

  3. 向 Ecma International 提交 rfc。

于 2013-08-16T16:29:44.397 回答