如果命名空间和 ClassMethod 为可选,则用于捕获 ClassName 的正则表达式模式将不起作用

问题描述 投票:0回答:1

正则表达式

(?<Namespace>[^@]*)?[\\\/](?<ClassName>[\w\d]*)@?(?<ClassMethod>[^@]*)?

我正在尝试从字符串中捕获命名空间、类名和类方法,其中命名空间和类方法是可选的。

如果所有三个孔都存在,则此模式可以捕获三个孔。但如果 ClassName 是唯一存在的东西,则会失败。

我发现的唯一解决方案是使用这个

(?<Namespace>[^@]*)?[\\\/]?(?<ClassName>[\w\d]*)@?(?<ClassMethod>[^@]*)?

但这根本没有捕获 ClassName 而是将其捕获到命名空间中。

我做错了什么?

字符串:

Api\Blah\Blah\CarController@doStuff

图案:

(?<Namespace>[^@]*)?[\\\/]?(?<ClassName>[\w\d]*)@?(?<ClassMethod>[^@]*)?

期待: 命名空间:

Api\Blah\Blah
班级名称:
CarController
类方法:
doStuff

php regex laravel string pattern-matching
1个回答
0
投票

正则表达式的问题在于

[^@]*
组中的
Namespace
过于贪婪,会消耗尽可能多的字符,包括用于分隔
Namespace
ClassName
组的反斜杠.

您可以通过使用

Namespace
使
[^@]*?
组变得非贪婪,并使用
[^@\\\/]*
而不是
[^@]*
来防止它消耗反斜杠和斜杠来解决此问题。这是修改后的正则表达式:

(?<Namespace>[^@\\\/]*?)[\\\/]?(?<ClassName>[\w\d]*)@?(?<ClassMethod>[^@]*)?
© www.soinside.com 2019 - 2024. All rights reserved.