我正在编写一个解析器,我想避免出于性能原因而切断输入字符串。因此,我创建了一个Stream
对象,用光标表示字符串:
const Stream = (string, cursor) => Object.freeze({
string,
cursor,
length: string.length - cursor,
slice: (start, end) => string.slice(start + cursor, end ? start + end : undefined),
move: distance => stream(string, cursor + distance),
})
我希望能够使用正则表达式来匹配此字符串。但是,我不关心光标前的任何事情。假设我有以下字符串和光标:
> string = 'hello ABCD'
'ABCD'
> cursor = 6
6
所以我们不关心A
之前的任何事情,但我们希望能够使用正则表达式来匹配所有这些大写字母:
> re = /^[A-Z]+/
/^[A-Z]+/
我不确定如何让它发挥作用。我注意到当您使用g
标记时,您可以使用RegExp.exec
并跟踪lastIndex
属性。但是,^
匹配不会从lastIndex
...
我有什么想法可以让它有效地运作?如果我必须使用第三方正则表达式库,我很好,但理想情况下可以使用本机RegExp ...
答案 0 :(得分:-2)
我会选择sed:
sed -rn 's/^.{'$cursor'}([A-Z]+)$/\1/p'
其中$ cursor是一个shell变量,包含开头忽略的字符数。
选项-r
是扩展正则表达式,-n
不会一直打印,如果匹配则会打印p
。
现在问题是如何将它移植到您的语言。 Here你有一些关于如何在Javascript中使用正则表达式中的变量的提示。