在字符串的一部分内进行正则表达式搜索

Posted

技术标签:

【中文标题】在字符串的一部分内进行正则表达式搜索【英文标题】: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 【参考方案1】:

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

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

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

    m 成为str.length - endIndex。 让n 成为str.length - lastIndex

    使用用 javascript 编写的具有内置子字符串扫描功能的正则表达式引擎。

    向 Ecma International 提交 rfc。

【讨论】:

你能解释一下.n$是什么吗?我不明白它是如何工作的。 在以下示例中:regex101.com/r/eA7cT0 仅当字符串末尾至少有 3 个字符时,字符串 'ab' 才匹配。这与将字符串切割为 3 个字符的长度并简单地匹配“ab”具有相同的效果。这是一个完全荒谬的,根本不执行,但有效:)

以上是关于在字符串的一部分内进行正则表达式搜索的主要内容,如果未能解决你的问题,请参考以下文章

第九章 使用正则表达式进行搜索

正则表达式(re)

MySQL必知应会-第9章-用正则表达式进行搜索

正则表达式-1

R语言学习13-正则表达式

使用正则表达式进行搜索