在字符串的一部分内进行正则表达式搜索
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);
然后做剩下的事情(也许首先验证starIndex
和endIndex
)
【参考方案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”具有相同的效果。这是一个完全荒谬的,根本不执行,但有效:)以上是关于在字符串的一部分内进行正则表达式搜索的主要内容,如果未能解决你的问题,请参考以下文章