(?<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
正则表达式的问题在于
[^@]*
组中的 Namespace
过于贪婪,会消耗尽可能多的字符,包括用于分隔 Namespace
和 ClassName
组的反斜杠.
您可以通过使用
Namespace
使 [^@]*?
组变得非贪婪,并使用 [^@\\\/]*
而不是 [^@]*
来防止它消耗反斜杠和斜杠来解决此问题。这是修改后的正则表达式:
(?<Namespace>[^@\\\/]*?)[\\\/]?(?<ClassName>[\w\d]*)@?(?<ClassMethod>[^@]*)?