【问题标题】:Ignoring an optional suffix with a greedy regex使用贪婪的正则表达式忽略可选后缀
【发布时间】:2010-11-28 04:33:41
【问题描述】:

我正在 .NET 中针对如下所示的字符串执行正则表达式匹配:

1;#Lists/General Discussion/Waffles Win 2;#Lists/General Discussion/Waffles Win/2_.000 3;#Lists/General Discussion/Waffles Win/3_.000

我需要匹配最后没有数字的 URL 部分,以便我得到这个:

列表/一般讨论/华夫饼赢

这是我正在尝试的正则表达式:

(?:\d+;#)(?.+)(?:/\d+_.\d+)*

问题是最后一组被包含在中间组的比赛中。我也试过没有 * 在最后但只有上面的第一个字符串匹配,而不是其余的。

我启用了多行选项。有什么想法吗?

【问题讨论】:

  • '(?.+)' 应该是什么?这是无效的正则表达式。
  • @MizardX:Markdown 搞砸了正则表达式。我会重新格式化修复。

标签: .net regex greedy regex-greedy


【解决方案1】:

几个不同的选择:

@"^\d+;#([^/]+(?:/[^/]+)*?)(?:/\d+_\.\d+)?$"

这匹配尽可能少的路径段,后跟可选的最后部分和行尾。

@"^\d+;#([^/]+(?:/(?!\d+_\.\d+$)[^/]+)*)"

这匹配尽可能多的路径段,只要它不是行尾的数字部分。

@"^\d+;#(.*?)(?:/\d+_\.\d+)?$"

这匹配尽可能少的字符,后跟可选的最后部分和行尾。

【讨论】:

  • 谢谢,最后一个有效。从来没有想过匹配终点线本身 - 我认为这是主要的区别。
  • 不同之处在于它使用了惰性量词 (.*?) 而不是贪心量词 (.+)。
【解决方案2】:

你可以试试

^(\d+;#)([^/]+(/[^\d][^/]*)*)

并获得第二组。第一组匹配1;#;第二组被拆分为第一部分或 URL(假设包含除 / 之外的任何字符),然后匹配任意数量的 / 组,后跟一个非数字,后跟除 / 之外的任何字符。

this site 上测试,似乎可以满足您的需求。尝试使用更多示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多