我希望能够在字符串中间开始匹配JavaScript正则表达式,并使用'^'限定(将正则表达式的开头锚定到我指定的起始点), 但是我找不到方法。
Perl和Python有我需要的功能(尽管它们彼此完全不同)。
在Perl中,我可以这样做:
在JavaScript中(至少在Node.js中),我尝试:
然后它确实匹配了,但是它也可以在4之后的任何位置匹配(这不是我想要的)。
背景:我正在处理名为Pegex的多语言解析框架的JavaScript端口,其中每个终端都是在当前解析位置尝试的正则表达式(并锚定到其前面)。效率是一个问题。例如,在我的起始点使用输入的子字符串副本将是最糟糕的解决方案。
我能想到的一个解决方案是将匹配的“index”值与我设置的“lastIndex”值进行比较,以查看它是否在开头匹配。这会丢掉'^'的效率,但可能不会花费太多,因为Pegex regex通常很小且没有回溯。
有人能想到更好的解决方案吗?
Perl和Python有我需要的功能(尽管它们彼此完全不同)。
在Perl中,我可以这样做:
$s = 'foo bar baz';
$r = qr/\Gbar/;
pos($s) = 4;
print 'OK' if $s =~ $r;
在Python中,我可以做到:
s = 'foo bar baz'
r = r'bar' # r'^bar' also works
if re.match(r, s[4:]): # re.match implies '^'
print 'OK'
在JavaScript中(至少在Node.js中),我尝试:
s = 'foo bar baz';
r = /^bar/g;
r.lastIndex = 4;
if (r.exec(s))
console.log('OK');
这个不起作用。如果我把第二行改成:
r = /bar/g;
然后它确实匹配了,但是它也可以在4之后的任何位置匹配(这不是我想要的)。
背景:我正在处理名为Pegex的多语言解析框架的JavaScript端口,其中每个终端都是在当前解析位置尝试的正则表达式(并锚定到其前面)。效率是一个问题。例如,在我的起始点使用输入的子字符串副本将是最糟糕的解决方案。
我能想到的一个解决方案是将匹配的“index”值与我设置的“lastIndex”值进行比较,以查看它是否在开头匹配。这会丢掉'^'的效率,但可能不会花费太多,因为Pegex regex通常很小且没有回溯。
有人能想到更好的解决方案吗?
substring()
并使用简单的正则表达式可能比避免substring()
的复杂正则表达式更快。 - jfriend00substr()
版本比正则表达式版本快8倍。 - jfriend00