【问题标题】:Regex - strip out text between first and second forward slashes正则表达式 - 去除第一个和第二个正斜杠之间的文本
【发布时间】:2012-02-13 13:53:31
【问题描述】:

我几乎可以使用这个正则表达式,但是在前导正斜杠上遇到了问题 - 任何人都可以看到我在哪里出错了吗?我只想从这个例子中提取第一个字符串“projects

  /projects/personal/29/56

参见此处-> http://regexr.com?300av

【问题讨论】:

  • 作为惯例,请在此处发布完整问题,而不是显示外部代码。
  • ^\/(.+)\/.*$ 并获得第 1 组

标签: javascript regex


【解决方案1】:

最简单的方法是使用正斜杠分割字符串

var firstString = url.split('/')[1];

您将拥有第一个字符串,但如果您想使用正则表达式提取而不是这样,请记住不要在您的正则表达式中添加全局参数。

\/([a-zA-Z0-9]{0,})

希望对你有帮助

【讨论】:

  • \/(\w+) 会更简洁,但无论如何拆分方法可能更好
【解决方案2】:

您似乎可以使用 split 进行测试,但对于纯正则表达式解决方案使用:

s = '/projects/personal/29/56';
arr = s.match(/^\/([^/]*)\//); // arr[1] becomes 'project'
document.writeln('<pre>Matched: [' + arr[1] + "]</pre>");

【讨论】:

    【解决方案3】:

    我玩弄了anubhava的答案并得到了以下内容

    string                          expression                             returns
    /projects/personal/29/56        ([a-zA-Z])([^/]*)\/                     projects/
    /projects/personal/29/56        ([a-zA-Z])([^/]*)                       projects
    /projects123/personal/29/56     ([a-zA-Z])*?([a-zA-Z][0-9])([^/]*)      projects123
    

    第二行实现了 bsod99 的要求:

    • 删除第一个斜线/
    • /projects/personal/29/56中提取第一个字符串projects

    【讨论】:

      【解决方案4】:

      为寻找此类答案的人添加。除了 url '/projects' 的第一部分之外,您还可以尝试添加全局标志以获取其他值。

      /projects/personal/29/56
      

      你只需要遍历最后出现的数组[i]

      /\/([a-zA-Z0-9]{0,})/g[i]
      
      expression                       returns
      i=0                             /projects
      i=1                             /personal
      i=2                             /29
      i=3                             /56
      

      【讨论】:

        【解决方案5】:

        我在这里添加答案,只是因为我想将它添加到[SO]: Python: return a string between // regex,并且该问题被标记为这个问题的副本(!!!当我正在编辑时!!!)。

        script.py

        #!/usr/bin/env python3
        
        import re
        
        
        def main():
            group_name = "between_slashes"
            words = [
                        "en/lemon_peel/n/",
                        "ca/llimona/n/",
                        "/asd /",
                        "/asd",
                        "asdf/",
                        "aa//vv",
                    ]
            pat = re.compile("^[^/]*/(?P<{}>[^/]*)/.*$".format(group_name))
            for idx, word in enumerate(words):
                match = pat.match(word)
                if match is not None:
                    print("{}: \"{}\" - \"{}\"".format(idx, word, match.group(group_name)))
                else:
                    print("{}: \"{}\"".format(idx, word))
        
        
        if __name__ == "__main__":
            main()
        

        注意事项

        • 这个模式看起来很复杂,但我会尽力解释它:
          1. 1stchar (^) 标记字符串的开始
          2. 以下 [] 匹配一个字符类:内容 (^/) 告诉它匹配/ 以外的任何字符
          3. 接下来,* 表示前一组 (#2.) 可能出现 0次或更多
          4. 然后它跟随 / 字符,这是我们的第一个st(开始)守卫
          5. 括号 () 表示组匹配 - 稍后可以通过其名称 (between_slashes) 来引用它。更多详情请查看[Python 3.Docs]: Regular Expression Syntax(搜索(?P&lt;name&gt;...)
          6. 括号之间的内容(在>之后)是我们正在寻找的(我们已经知道什么):0个或多个非/ 字符s
          7. 下一个 / char 是我们的第二个nd(结束)后卫
          8. 然后,.* 告诉:任何 char,0 次或多次
          9. 最后,$标记了字符串的结尾
        • 我冒昧地添加了更多要搜索的字符串,除了问题中提供的字符串之外,以说明一些极端情况
        • 使用 Python 3Python 2 运行

        输出

        c:\Work\Dev\StackOverflow\q45985002>"c:\Install\x64\Python\Python\3.5\python.exe" script.py
        0: "en/lemon_peel/n/" - "lemon_peel"
        1: "ca/llimona/n/" - "llimona"
        2: "/asd /" - "asd "
        3: "/asd"
        4: "asdf/"
        5: "aa//vv" - ""
        

        【讨论】:

          【解决方案6】:

          在 JS RegEx 中你可以使用:

          \B\/([a-zA-Z0-9-]{0,})\S
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-04-19
            • 2022-01-27
            • 2020-05-15
            • 2022-11-13
            • 2021-02-10
            • 2019-01-10
            相关资源
            最近更新 更多