Javascript Typescript:正则表达式与预期模式不匹配

Javascript Typescript:正则表达式与预期模式不匹配,javascript,regex,typescript,webpack,Javascript,Regex,Typescript,Webpack,我在typescript函数中有以下正则表达式: /([1-9][0-9]*)*?[d]([468]|(?!(22|32|42|52|62|72|82|92|102|200|202))([12][20]{1,2}))([rf!<>=][1-9][0-9]{1,2})*?/g /([1-9][0-9]*)?[d]([468]|(?!(22 | 32 | 42 | 52 | 62 | 72 | 82 | 92 | 102 | 200 | 202))([12][20]{1,2})([rf

我在typescript函数中有以下正则表达式:

/([1-9][0-9]*)*?[d]([468]|(?!(22|32|42|52|62|72|82|92|102|200|202))([12][20]{1,2}))([rf!<>=][1-9][0-9]{1,2})*?/g
/([1-9][0-9]*)?[d]([468]|(?!(22 | 32 | 42 | 52 | 62 | 72 | 82 | 92 | 102 | 200 | 202))([12][20]{1,2})([rf 1-9][0-9]{1,2})*/g
此正则表达式的目的是匹配骰子命令,类似于roll20处理其骰子命令的方式(例如1d10!掷1d10,如果它落在10上,则掷另一个d10,依此类推)

前两个组工作得很好(我可以在我的应用程序中单独运行,并确认它们按预期工作)

最后一组
([rf!=][1-9][0-9]{1,2})*?
不匹配,除非我将
^
添加到正则表达式的开头,并将
$
添加到结尾


作为补充,我确信有更有效的方法来编写这个正则表达式-如果您对正则表达式本身有任何输入也是受欢迎的。

在正则表达式模式末尾带有
*?
的延迟量化子模式将永远不会匹配单个字符,它将始终匹配空字符串


你需要用贪婪的量词替换懒惰的量词,以避免在这里添加锚,
([rf!=][1-9][0-9]{1,2})*?
->
([rf!=][1-9][0-9]{1,2})*

删除
,使用
([rf!=][1-9][0-9]{1,2})*
谢谢,我认为这是可选的,看来我弄错了。如果您提交了答案,我会将其标记为已接受答案。谢谢谢谢你解释我做错了什么!您已经解释过了,这很有意义。仅供参考:
([rf!=][1-9][0-9]{1,2})*?
不获取字符,因为首先跳过惰性子模式,然后尝试所有后续子模式。只有当后续子模式不匹配时,延迟量化的子模式才被“扩展”,实际由正则表达式引擎使用,即发生反向回溯(一种“前向跟踪”)。