【问题标题】:Regex trouble: how to get everything between the last two forward slashes正则表达式的麻烦:如何在最后两个正斜杠之间获取所有内容
【发布时间】:2014-02-25 13:03:59
【问题描述】:

我有一个带有可变数量反斜杠的字符串。现在我只想收集最后两个反斜杠之间的部分(字母)。

如果我有/this/is/a/string/blablablablabla,我想捕获string,如果我有/this/is/a/longer/string/than/the/one/before/baba,我想捕获before

我试过的是:

 Regex.Match(myString, @"/(.*)/.*$").Groups[0].Value

但这捕获了第一个斜线和最后一个斜线之间的所有内容,我希望它位于最后一个斜线之间。我对正则表达式很陌生,希望有人能帮助我。

leon 的最后一个答案是/([^/]*)/[^/]*$,但这也捕获了最后一个 / 之后的所有内容,并且还包括第一个 /

我该如何解决这个问题?

【问题讨论】:

  • 你能告诉我们你使用了什么,或者你到目前为止采取了什么过程吗?
  • @NewAmbition 在我最后一次尝试中更新了这个问题。 :)
  • 可能是(?<=/)(?<content>\w+)/(?!\w+/) 可能会有所帮助,我认为可能有更简单的表达式,但无论如何这个都可以。您可以从Match.Groups["content"].Value 访问比赛。
  • @Mathew 谢谢。很高兴知道您可以使用 <> 决定捕获组名称。

标签: c# regex


【解决方案1】:

如果你的字符串中只有一个这样的模式,你可以使用

/(\w+)/[^/]*$

您的数据在第一个捕获的组中。

[^/] 将匹配任何内容,但 /\w[0-9a-zA-Z_] 的缩写。


编辑:来自 OP 的评论

Groups[1] 是第一个捕获组。所以 C# 中的答案是:

answer = Regex.Match(myString, @"/(\w+)/[^/]*$").Groups[1].Value;

让我们看一下:/ 表示我们匹配/,然后我们用(\w+) 捕获一个或多个单词,然后在/ 处停止。然后我们不匹配斜线本身与[^/],我们匹配所有内容直到结束(*$)

【讨论】:

  • 哦忘了说,最后一个反斜杠不是字符串的结尾。
  • 我们可以在两者之间添加一个.* 吗?
  • 更新了答案,您可以使用[^/]+ 而不是\w+,但这会导致多行问题。 .* 一般尽量避免,因为很容易导致回溯。
  • 谢谢。它还捕获第一个/ 之后的部分。当然我可以拆分它,但我确信必须对正则表达式进行改进才能摆脱它?
  • @user2609980:您的数据在捕获的组中,而不是匹配项。了解如何以您的语言访问这些内容。
【解决方案2】:

您的问题的直接答案是:

/([^/]*)/[^/]*$

或者,由于您的字符串非常简单,您可以完全避免使用正则表达式:

if (input.EndsWith("/"))
    return input.Split('/').Last();
else
    return input.Split('/').Reverse().Skip(1).First();

【讨论】:

  • 不一定以/ 结尾。您的正则表达式有效,除了 if 还捕获第一个 / 并捕获最后一个之后的所有内容,这是我不想要的。
  • @user2609980 我提供的正则表达式包含一个捕获组 - 这将包含您正在寻找的内容:Regex.Match(...).Groups[1].ValueGroups[0] 是整个表达式)。否则请参考我的第二个解决方案。
【解决方案3】:

试试这个http://regexr.com?38c43

(?:[a-z/]+)/([a-z]+)

查看第一个(也是唯一一个)组,它将包含最后一项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 2021-11-18
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-10
    • 2017-05-22
    • 1970-01-01
    相关资源
    最近更新 更多