你可以用
^[\w.]+:[^|]+\|[^|]+(?:\|#(?:[\w.]+:[^,\n]+(?:,|$))*)?$
^^^^^^^^ ^^
见
regex demo
关键是你只匹配
.
介于两者之间
|
S,我建议匹配一个或多个字符,而不是
|
在那里,通过包装使其余的可选
\|#(?:[\w.]+:[^,\n]+(?:,|$))*
在可选的非捕获组中,
(?:...)?
是的。
细节
-
^
-字符串开头
-
[\w.]+
-1+字或
是的。
字符
-
:
-结肠
-
[^|]+
-与1+non匹配的反字符类-
|
字符
-
\|
-一个
|
烧焦
-
[^]]+
-1+字符
|
-
(?:\|#(?:[\w.]+:[^,\n]+(?:,|$))*)?
-一个可选的非捕获组,与
-
\|#
-
|#
子串
-
(?:[\w.]+:[^,\n]+(?:,|$))*
-连续重复0次或多次
-
[\w.]+:
-1+字或
是的。
然后是chars
:
-
[^,\n]+
-除了lf以外的1+字符(我猜这里是用来调试的)和
,
-
(?:,|$)
-
,
或字符串结尾
-
$
-字符串结束。