我正在调查 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
小组结果:
time
:1h 5m 1s
title
:Title test
prize
:Something random
您需要稍微限制您的模式才能摆脱 .*
这将耗尽后续子模式最后一次出现的所有内容。然后,每当您需要将值匹配到下一个键时,请使用惰性点模式( .*?
),并添加 $
。 (字符串结尾) anchor 位于末尾,以确保您将获得带有惰性点的所有文本。
d(?:uration)?:(?<time>.*?)\s*t(?:itle)?:(?<title>.*?)\s*(?:p(?:rize)?:(?<prize>.*))?$
请参阅regex pattern .
详细信息
-
d(?:uration)?:
- 一个d:
或duration:
-
(?<time>.*?)
- 组“时间”:任何零个或多个字符,尽可能少,直到后续子模式的最左边出现
-
\s*
- 0+ 空格
-
t(?:itle)?:
- 要么 title:
或t:
-
(?<title>.*?)
- 组“标题”:任何零个或多个字符,尽可能少
-
\s*
- 0+ 空格
-
(?:
- 可选非捕获组的开始匹配 1 或 0 次出现:
-
p(?:rize)?:
-p:
或prize:
-
(?<prize>.*)
- 组“奖品”:任何零个或多个字符,尽可能少
-
)?
- 可选组的结尾
-
$
- 字符串结尾。
我是一名优秀的程序员,十分优秀!