Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Easy RegExp不匹配_Javascript_Regex - Fatal编程技术网

Javascript Easy RegExp不匹配

Javascript Easy RegExp不匹配,javascript,regex,Javascript,Regex,我想匹配那些URL de-de/checkout/ de-de/checkout/confirm/ 使用RegExp。我尝试了/(.*)\/checkout\/(|$| confirm\/$)/g,但我只得到了两个匹配项 de-de/checkout/ de-de/checkout/ 这可能很容易,但我不知道为什么这不起作用 谢谢你的帮助 删除备选方案中的前导|: /(.*)\/checkout\/($|confirm\/$)/g 正则表达式将选择无界替换组中的最短替换,并且您为其提供了0

我想匹配那些URL

de-de/checkout/
de-de/checkout/confirm/
使用RegExp。我尝试了
/(.*)\/checkout\/(|$| confirm\/$)/g
,但我只得到了两个匹配项

de-de/checkout/
de-de/checkout/
这可能很容易,但我不知道为什么这不起作用


谢谢你的帮助

删除备选方案中的前导
|

/(.*)\/checkout\/($|confirm\/$)/g
正则表达式将选择无界替换组中的最短替换,并且您为其提供了0长度匹配。

在当前状态下,您的替换意味着“要么什么都不做,要么字符串结束,要么确认/后跟字符串结束”。

我认为这更容易理解:

(.+?)?\/checkout\/(?:confirm\/)?
尽管我不确定您是否需要简单地匹配url(真/假)或捕获
de
或您提供的示例之前或之后的任何内容

confirm
被包装到非捕获组中,因为它是唯一可能存在或不存在的路径组件

在regexr.com上有两个匹配项
这是考虑到checkout或confirm是一个关键字

您想用相同的正则表达式来匹配这两个关键字,还是每个正则表达式都匹配一个?嗨,Emil,两者都是相同的。
/(.*)\/checkout\/{0,1}(confirm{0,1}\/{0,1}){0,1}/ig
删除第一个
|
-将您的regexp粘贴到regexp测试仪(如regex101)中,并阅读类似英语的描述。当涉及到替换时,使用惰性术语(通常用于量词)不是一个好主意。Regex是lazy是一个非常模糊的语句。您还可以补充一点,Regex在未编排的备选组中选择最短的备选方案,因为它与锚定的备选方案没有区别。模式末尾的位置是未编排的,根据NFA regex规范,匹配的第一个备选方案将“获胜”。@Toni2708请参阅。请注意,我必须添加
m
多行标志,以便
$
匹配第一行的末尾。如果你逐行解析,你不需要这个,也可以考虑使用@ TMSLNZ的答案,这在我看来是比较干净的。我主要是想给你一个关于为什么你的正则表达式不起作用的答案。也许,OP需要确保在
签出/
确认/
之后没有任何东西,所以我建议保留
$
-
/(*?)\/checkout\/(?:确认\/)?$/
,除此之外,请更具体一些。你的目标网址是什么
(.*)\/checkout\/(confirm\/)?