正则表达式:不尊重最短路径

发布于 2024-12-22 01:13:27 字数 368 浏览 2 评论 0原文

我想解析这样的内容:

{{word1|word2|word3|word4|...}}
{{word1|word2|word3}}
...

使用 preg_match_all。 我只需要前 3 个单词,所以我制作了这个正则表达式:

/\{\{(.*)\|(.*)\|(.*)[\|.*]?\}\}/Uim

但是当有 4 个或更多单词时,第三个捕获组采用 word3|word4|...

我期望 U< /code> 修饰符采用最短路径,所以我不知道我在这里做错了什么。有人可以帮我吗?

I want to parse something like this:

{{word1|word2|word3|word4|...}}
{{word1|word2|word3}}
...

with preg_match_all.
I just need the 3 first words, so I made this regex:

/\{\{(.*)\|(.*)\|(.*)[\|.*]?\}\}/Uim

But when there are 4 words or more, the third capturing group takes word3|word4|...

I expected the U modifier to take the shortest path, so I don't know what I'm doing wrong here. Can someone help me please ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦罢 2024-12-29 01:13:27

一种可能性:

\{\{([^|]*)\|([^|]*)\|([^|]*)(?:\||\}\})

解释:

\{\{          # Two of {{ 
([^|]*)       # Any characters until '|'
\|            # Character '|'
([^|]*)       # Any characters until '|'
\|            # Character '|'
([^|]*)       # Any characters until '|'
(?:\||\}\})   # A vertical bar, or two }}, without grouping.

One possibility:

\{\{([^|]*)\|([^|]*)\|([^|]*)(?:\||\}\})

Explanation:

\{\{          # Two of {{ 
([^|]*)       # Any characters until '|'
\|            # Character '|'
([^|]*)       # Any characters until '|'
\|            # Character '|'
([^|]*)       # Any characters until '|'
(?:\||\}\})   # A vertical bar, or two }}, without grouping.
蒲公英的约定 2024-12-29 01:13:27

试试这个:

/^\{\{([^|]+)\|([^|]+)\|([^|]+)/im

.* 也需要 | 所以它匹配 word1|word2...

edit:

更好的版本:

preg_match_all('/^{{([^|}]+)\|([^|}]+)\|([^|}]+)/m', "{{word1|word2|word3|word4|...}}\n{{word5|word6|word7}}", $matches, PREG_SET_ORDER);
var_dump($matches)

Try this:

/^\{\{([^|]+)\|([^|]+)\|([^|]+)/im

.* takes | too so it matches word1|word2...

edit:

better version:

preg_match_all('/^{{([^|}]+)\|([^|}]+)\|([^|}]+)/m', "{{word1|word2|word3|word4|...}}\n{{word5|word6|word7}}", $matches, PREG_SET_ORDER);
var_dump($matches)
凉世弥音 2024-12-29 01:13:27

在这里试试这个

/\{\{([^|]*)\|([^|]*)\|([^|]*).*\}\}/

Regexr 上查看

因为您不搜索字母,所以不需要修饰符i,没有锚点 ^$,因此不需要修饰符 m。我在这里使用了 [^|] ,它在设计上是不贪婪的,所以不需要 U

Try this here

/\{\{([^|]*)\|([^|]*)\|([^|]*).*\}\}/

See it here on Regexr

Since you don't search for letters, so you don't need the modifier i, no anchors ^ or $ so no modifier m is needed. I used here [^|] which is ungreedy by design, so no U needed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文