1

我正在研究一个支持以字母开头的命名参数的Xregexp表达式。这是我的表达:

(?:d:|duration:)(?<time>.*\S+).*(?:t:|title:)(?<title>(?:.*\S+))(?:.*(?:(?:p:|prize:)(?<prize>.*\S+)))

它运行良好,但问题是我想将该p:<prize>组设为可选,我应该使用哪个表达式?

当有空白时,我也试图结束捕获

例子:

我想要的是 :

duration:1h 5m 1s title:Title test [p:prize]<-optionnal group

我想将该prize组设为可选

匹配当前表达式:

duration:1h 5m 1s title:Title test p:Something random

分组结果:

  • time1h 5m 1s

  • titleTitle test

  • prizeSomething random

4

1 回答 1

0

您需要稍微限制您的模式以摆脱.*这种情况,直到最后一次出现后续子模式。.*?然后,当您需要将一个值匹配到下一个键时,使用惰性点模式 ( ),并在末尾添加一个$(字符串结尾)锚点,以确保您将获得所有带有惰性点的文本。

d(?:uration)?:(?<time>.*?)\s*t(?:itle)?:(?<title>.*?)\s*(?:p(?:rize)?:(?<prize>.*))?$

请参阅正则表达式模式

细节

  • d(?:uration)?:- 一个d:duration:
  • (?<time>.*?)- 组“时间”:任何零个或多个字符,尽可能少,直到后续子模式的最左边出现
  • \s*- 0+ 个空格
  • t(?:itle)?:- 要么title:t:
  • (?<title>.*?)- 组“标题”:任何零个或多个字符,尽可能少
  • \s*- 0+ 个空格
  • (?: - 匹配 1 次或 0 次出现的可选非捕获组的开始:
    • p(?:rize)?:-p:prize:
    • (?<prize>.*)- 组“奖品”:任何零个或多个字符,尽可能少
  • )?- 可选组结束
  • $- 字符串结束。
于 2017-08-28T11:57:22.173 回答