Javascript 正则表达式匹配特定的URL片段,而不是所有其他可能的URL

Javascript 正则表达式匹配特定的URL片段,而不是所有其他可能的URL,javascript,regex,url,url-fragment,Javascript,Regex,Url,Url Fragment,我有example.com网站,在那里我有账户页面。 它可能有GET参数,这也是帐户页面的一部分。 它也可能有URL片段。如果是home.htmlfragment,它仍然是帐户页面。如果是另一个片段,那么它是帐户页面的另一个子页面 所以-我需要一个正则表达式(JS)来匹配这个案例。这就是我迄今为止成功构建的: example.com\/account\/(|.*\#home\.html|(\?(?!.*#.*)))$ 前4个是我需要的案例。如你所见,第二行与我的正则表达式不匹配 我在这里遗漏

我有example.com网站,在那里我有
账户
页面。 它可能有GET参数,这也是帐户页面的一部分。 它也可能有URL片段。如果是
home.html
fragment,它仍然是帐户页面。如果是另一个片段,那么它是帐户页面的另一个子页面

所以-我需要一个正则表达式(JS)来匹配这个案例。这就是我迄今为止成功构建的:

example.com\/account\/(|.*\#home\.html|(\?(?!.*#.*)))$

前4个是我需要的案例。如你所见,第二行与我的正则表达式不匹配


我在这里遗漏了什么?

您组中的第三个备选方案有一个消极的前瞻性,确保它拒绝包含
#
的任何文本,但在行尾之前您并没有特别提到任何应该匹配其余内容的内容。检查这个更新的正则表达式演示

如果您注意到了,我在
com
之前跳过了您的第一个点,并在负前瞻部分之后添加了
*
,以便它与您的第二个示例相匹配。

example\.com\/account\/(\??[^\r\n]+)(\?home\.html)$
这与您的前四个字符串匹配

example.com/account/
example.com/account/?brand=mine
example.com/account/#home.html
example.com/account/?brand=mine#home.html
不包括你的最后两个

example.com/account/#other.html
example.com/account/?brand=mine#other.html

您可以创建两个可选组,一个可选地匹配
,并匹配除
#
之外的任何字符,另一个可选组匹配
#home.html

请注意,要转义圆点,使其符合字面意思

^example\.com\/account\/(?:\?[^#\r\n]*)?(?:#home\.html)?$
  • ^
    字符串的开头
  • 示例\.com\/account\/
    匹配开始
  • (?:
    非捕获组
    • \?[^\r\n]*
      匹配
      和0+乘以除
      \
      或换行符以外的任何字符
  • )?
    关闭组并将其设置为可选
  • (?:
    非捕获组
    • #home\.html
      匹配
      #home.html
  • )?
    关闭组并将其设置为可选
  • $

let pattern=/^example\.com\/account\/(?:\?[^\r\n]*)?(?:\home\.html)?$/;
[
“example.com/account/”,
“example.com/account/?brand=mine”,
“example.com/account/#home.html”,
“example.com/account/?brand=mine#home.html”,
“example.com/account/#other.html”,
“example.com/account/?brand=mine#other.html”

].forEach(url=>console.log(url+“-->”+pattern.test(url))
您可能对
窗口感兴趣。位置
对象,您可以在其中检查
路径名
哈希
,而无需担心参数。但是,如果需要,可以在
搜索
中找到参数。是否要排除最后两种情况?这在第三方工具中发生,否则,我会让它只检查路径名和散列,并处理我想要的所有情况:)您是否正在寻找类似的内容,但我在
.
后面有
.
。。。我以为这是在处理其余字符,直到URL的结尾…@peshohristov:好的,只需要将
.
之后的
.
从负前瞻中去掉,它就会像你期望的那样工作。检查这个更新的链接感谢解释,这是有用的:“不太确定<代码> XYZ.COM//x 123 是有效的URL模式,如果不是,我们可能需要有<代码> */Cuth.Qualter替换为<代码> +<代码>,并且还考虑有一些类似于<代码> CurryNAM= QuealValue结构,无论如何+1@CodeManiac我明白你的意思。在这种情况下,它仅用于广泛匹配,可能会匹配更可疑的url格式。在这种情况下,我认为OP允许的一组特定字符会更好。是的,我完全同意你的看法,正则表达式只能处理指定字符,为了更通用,我们应该始终更喜欢URL api:)