【问题标题】:Find the first instance of a character, then work backwards找到一个字符的第一个实例,然后向后工作
【发布时间】:2020-02-13 16:56:42
【问题描述】:

我不知道如何找到第一个实例,然后使用正则表达式“向后”工作......

我有一些字符串,其中产品代码与产品名称相结合。不幸的是,分隔产品代码和产品代码的分隔符(破折号)是相同的。

产品代码可以有不同数量的分隔符。有些产品代码有一个破折号,而其他产品代码可能有多个破折号。

但是,我知道所有产品名称都有空格。

所以取这两个字符串,例如:

  • “ABC-ER-015-30-NEW YORK 双色耳环”
  • “ABC-1234-加州定制产品”

我想做相当于:

  • 找到第一个空格...
  • 然后向后查找最后一个破折号...
  • 然后提取那个破折号之前的所有内容...

所以我想从上面的 2 个例子中提取: - “ABC-ER-015-30” - “ABC-1234”

如果项目名称中没有破折号,则此方法有效:

(.*)-

但如果项目名称中有破折号,它会捕获项目名称的一部分。

我觉得我缺少一些非常简单的东西。

【问题讨论】:

    标签: regex


    【解决方案1】:

    您可以使用以下模式:

    ^(?:[A-Z0-9]+-?)+?(?=-\S+[ ])
    

    Demo.

    细分:

    ^               # Beginning of the string.
    (?:             # Start of a non-capturing group.
        [A-Z0-9]+   # Any uppercase letter or a digit repeated one or more times.
        -?          # An optional hyphen characters.
    )               # End of the non-capturing group.
    (?=             # Start of a positive Lookahead.
        -           # Matches a hyphen character literally.
        \S+         # Any non-whitespace character repeated one or more times.
        [ ]         # Matches a space character.
    )               # End of the lookahead.
    

    参考资料:

    【讨论】:

    • 这种细分太棒了。我是正则表达式的初学者,所以这很有帮助。谢谢!
    【解决方案2】:

    您可以使用匹配 1+ 个大写字符并重复匹配破折号和 1+ 个大写字符。

    当您know that all product names have a space 时,您可以添加一个肯定的前瞻断言一个破折号,1+ 个非空白字符后跟一个空格。

    ^[A-Z0-9]+(?:-[A-Z0-9]+)+(?=-\S+ )
    
    • ^ 字符串开始
    • [A-Z0-9]+匹配1+次A-Z0-9
    • (?:-[A-Z0-9]+)+ 重复 1+ 次匹配 - 和 A-Z0-9
    • (?=-\S+ ) 正向前瞻,断言 -,1+ 非空白字符和一个空格

    Regex demo

    另一种选择是使用捕获组而不是正向前瞻

    ^([A-Z0-9]+(?:-[A-Z0-9]+)+)-\S+ 
    

    Regex demo

    【讨论】:

    • ++ 用于简单的非前瞻解决方案
    • 感谢您的快速回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-23
    相关资源
    最近更新 更多