具有可选字符的正则表达式

时间:2017-03-15 12:26:15

标签: php regex

我正在使用正则表达式(用于php)来匹配这种标记:

  • {€取向:景观:FOO:酒吧}
  • {€取向:景观:FOO}
  • {€取向:景观}
  • {€取向}

我实际上这个harcodred正则表达式只适用于第二个标签

/{€([\da-zA-Z_-]+:[\da-zA-Z_-]+:[\da-zA-Z_]+)}/

2 个答案:

答案 0 :(得分:0)

:开头的字符串部分应该重复0 - n次,我是对的吗?

可以用这个

完成
\{\€([\da-zA-Z_-])+(\:[\da-zA-Z\_\-]+)*\}

正则表达式的第二部分((\:[\da-zA-Z\_\-]+)*)表示"以冒号开头,后跟数字序列,字符,下划线和短于一个字符的短划线应在字符串中重复0到n次# 34。

你可以玩它here

答案 1 :(得分:0)

您可以使用单行正则表达式从:内部获取单独的{...}个分隔值:

preg_match_all('~(?:\G(?!\A):|{€(?=[^{}]*}))\K[\da-zA-Z_-]+~u', $s, $result)

请参阅regex demo

<强>详情:

  • (?:\G(?!\A):|{€(?=[^{}]*})) - 上一次成功匹配的结束时:之后的\G(?!\A):|部分)或()带{{1}的左括号}之后,除}以外的0 +字符之后必须有}(见(?=[^{}]*}) lookahead)
  • \K - 匹配重置运算符
  • [\da-zA-Z_-]+ - (返回的实际匹配项)一个或多个字母,数字,_-符号