【问题标题】:Regex match exact pattern but only last occurence正则表达式匹配精确模式但仅最后一次出现
【发布时间】:2014-10-24 12:22:59
【问题描述】:

我正在寻找一个解析以下字符串的正则表达式:

My Name Here(123456789) some_code[some_other_code]

格式比较简单:

  • 我的名字 这是一个 Steam 名称(我认为几乎可以是任何名称)。
  • 后面是括号之间的数字。名称和左括号之间没有空格。
  • 后跟一个空格。
  • 在这种情况下,后跟一个代号(我认为它不能包含空格)“some_code”。
  • 在这种情况下,在块括号“[some_other_code]”之间后跟另一个代码(同样可能没有空格)。

我想捕捉所有四个:

  • “我的名字在这里”
  • 123456789
  • 一些代码
  • some_other_code

以下正则表达式有效:

(.*?)\(([0-9]*)\) (.*?)\[(.*?)\]

问题在于,就我所知,第一个“我的名字”部分还可能在括号之间包含一个数字……而不是“我的名字”,它可能是“Nick(123) (456) Abcd”。而且这不正确匹配...

相同的正则表达式匹配这个:

Nick(123) (456) Abcd(123456789) some_code[some_other_code]

第一个捕获组现在只捕获“Nick”(虽然它应该捕获“Nick(123) (456) Abcd”),而第二个捕获组捕获 123 作为数字,而它应该捕获最后一次出现的 123456789。

换句话说,我只希望 (([0-9]*)) 的最后一次匹配作为第二组,而不是第一组...

我想我需要使用回顾之类的东西,但我不知道如何实现这个......有什么想法吗?

【问题讨论】:

    标签: regex


    【解决方案1】:

    只需删除第一个捕获组中存在的? 量词。这样它将捕获从开头 greedily最长匹配)到最后一个 ( 括号的所有字符。

    (.*)\(([0-9]*)\) (.*?)\[(.*?)\]
    

    DEMO

    【讨论】:

    • 甜,这比我预期的要容易...谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多