正则表达式 - 去除第一个和第二个正斜杠之间的文本

6
我几乎已经将这个正则表达式做好了,但是在处理前斜杠时遇到了麻烦。有没有人能看出我的问题所在?我只想从这个例子中提取第一个字符串 "projects" 。
  /projects/personal/29/56

see also here -> http://regexr.com?300av


1
作为一种惯例,请在此处发布完整的问题,而不是显示外部代码。 - anubhava
1
^\/(.+)\/.*$ 并获取第一组。 - epoch
6个回答

30

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

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

如果你想提取第一个字符串,可以使用以下正则表达式,但要注意不要在正则表达式中添加全局参数。

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

希望这能有所帮助


1
"/(\w+)"可能更简洁,但使用split方法可能更好。 - wheresrhys

4

看起来你可以使用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

2

对于寻找此类答案的人,您可以尝试添加全局标志以获取其他值,并且除了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

1

我在这里添加答案,只是因为我想将其添加到[SO]:Python:在// 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. 第一个字符(^)标记字符串的开头
    2. 接下来的[]匹配一个字符类:方括号中的内容(^/)表示匹配除了/以外的任何字符
    3. 然后是*,表示前面的组(#2.)可以出现0次或多次
    4. 接着是/字符,它是我们的第一个(开始)保护符
    5. 圆括号()表示一个分组匹配——稍后可以通过其名称(between_slashes)引用。有关详细信息,请参阅[Python 3.Docs]: Regular Expression Syntax(搜索(?P<name>...)
    6. 圆括号中的内容(在>之后)就是我们要找的内容(我们已经知道了): 0个或多个非/字符
    7. 下一个/字符是我们的第二个(结束)保护符
    8. 接着,.*表示:任何字符,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" - ""

0
在JS RegEx中,你可以使用:
\B\/([a-zA-Z0-9-]{0,})\S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接