【问题标题】:PHP Regex: group must end with character but do not capture this characterPHP Regex:组必须以字符结尾但不捕获此字符
【发布时间】:2013-09-30 03:06:29
【问题描述】:

示例正则表达式:

/^([\w]+:)?other:(.*)$/

示例字符串:

test:other:words...

第一组将匹配“test:”,但我希望它只捕获“test”。一开始我以为:

/^([\w]+)?:?other:(.*)$/

但我意识到一开始我不能有一个 :。我如何捕获一个如果存在必须以 : 结尾的组,但是这个 : 不能被该组捕获?

输入输出示例:

randomString:constantString:somethingElse

应该将“randomString”作为第一组。

constantString:somethingElse

应该将第一组设为空

【问题讨论】:

  • 我不知道你的全部情况,但也许这更容易得到第一个':'之前的所有内容^([^:]+) =)
  • @Enissay,不。这个随机字符串不能由任何字符组成,只能由我需要的字符组成。
  • 非捕获或非消费匹配?
  • 是的,当你添加一个例子时事情就更清楚了……记得总是添加一个:)

标签: php regex


【解决方案1】:

如果您希望您的第一个单词是可选的,请使用:

/^(?:(\w+):)?other:(.*)$/

这个正则表达式使\w+: 成为一个整体的非捕获组,并使其成为可选的。另外,它内部还使用了一个捕获组来捕获\w+部分。

所以,如果\w+: 存在,则组1 包含\w+ 部分,否则它包含一个空字符串。

【讨论】:

  • 但是我需要第一组是可选的。
  • @Dalius。如果您可以发布一些示例输入和输出,那就更好了。很难理解你真正想要什么。
  • @Dalius。编辑答案。
  • 不确定我应该将哪个答案标记为已接受。两者都是一样的,但我当前标记的是第一个:?
  • @Dalius。别担心。你可以接受任何你喜欢的答案。
【解决方案2】:

我们开始吧:

^(?:(\w+):)?constantString:(.*)$

(?:) 是一个非捕获组

Demo

【讨论】:

    猜你喜欢
    • 2015-10-19
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2012-11-28
    • 1970-01-01
    • 2014-09-21
    • 2017-02-10
    相关资源
    最近更新 更多