【问题标题】:RegExp search within part of string在字符串的一部分内进行正则表达式搜索
【发布时间】:2013-08-19 01:47:07
【问题描述】:

我需要一些 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);
}

【问题讨论】:

  • 你到底想做什么?对字符串的特定部分执行正则表达式搜索?您应该只使用子字符串,它不会成为性能问题
  • 我需要将一些 Python 文本搜索引擎移植到 JavaScript 中。在这个函数中,我需要在某些索引之间的字符串的特定部分内执行正则表达式搜索。
  • 然后试试substring 看看它是如何执行的,把它放在你的函数的开头:str = str.substring(startIndex, endIndex); 然后做剩下的事情(也许首先验证starIndexendIndex

标签: javascript python regex


【解决方案1】:

由于 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。

【讨论】:

  • 你能解释一下.{n}$是什么吗?我不明白它是如何工作的。
  • 在以下示例中:regex101.com/r/eA7cT0 仅当字符串末尾至少有 3 个字符时,字符串 'ab' 才匹配。这与将字符串切割为 3 个字符的长度并简单地匹配“ab”具有相同的效果。这是一个完全荒谬的,根本不执行,但有效:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2011-07-28
  • 2019-09-24
  • 1970-01-01
相关资源
最近更新 更多