为什么我的命名捕获组不起作用?

时间:2020-05-07 20:32:36

标签: javascript regex

说我有代表电影的文件名列表。每部电影肯定都有标题和文件扩展名,但每个文件名都可以包含0-3标签列表。标签列表是一对用逗号分隔的标签的圆括号;标签以%(对于系列/专营权名称),@(对于人)或#(对于描述性标签)开头,每种都在自己的列表中。它们始终在文件扩展名之前,之间没有空格,并且始终以(%series,%series)(@person,@person)(#tag,tag)的顺序出现。例子:

  • Casablanca.mov
  • 帝国反击战(%Star Wars).mov
  • 绝地归来(%Star Wars)(@ George Lucas,@ Carrie Fisher).mov
  • 幻影威胁(%Star Wars,%Star Wars Prequels)(#scifi,#action).mov
  • 侏罗纪公园(@Steven Spielberg)(#dinosaurs).mov
  • 泰坦尼克号(#disaster).mov

我的目标是编写一个包含命名捕获组titleserieslistpeoplelisttaglist的正则表达式,以帮助我整齐地提取所有这些内容。

当它们全部出现时我可以管理它,但是在使它们成为可选项方面我感到很困惑,而且这是一个难以理解的大表达式,很难解析。

到目前为止,这是我最大的努力。它与所有标签列表匹配,并且在缺少任何标签时都可以使用...但前提是标题后面有空格。标题匹配组后面有一个空格,这很有意义。但是,如果我从正则表达式中删除该空间,则所有其他组都将失败,并且我不明白为什么。我忽略了一些愚蠢的东西吗?我想念的是懒惰/贪婪的东西吗?

(?<title>.+) (?:\((?<series>%[^)]+)?\))?(?:\((?<people>@[^)]+)?\))?(?:\((?<tags>#.+)\))?(?<extension>\.[^.]+)$

Here is my Regex101 page with a set of unit tests在“切换到单元测试”标签上,希望它们比我的描述更有意义。

非常感谢任何能帮助我意识到我的错误的人。

1 个答案:

答案 0 :(得分:0)

您可以使用此正则表达式:

use Laravel\Passport\Bridge\UserRepository;
use Laravel\Passport\Bridge\User;

class MyUserRepository extends UserRepository
{
    public function getUserEntityByUserCredentials(
        $username,
        $password,
        $grantType,
        ClientEntityInterface $clientEntity
    ) {
        $user = UserModel::first(['username' => $username]);
        if ($user->password == $password) {
            return new User($user->getAuthIdentifier());
        }
        return null;
    }
}

Demo on regex101

系列,人物和标签捕获组被交替放置,然后重复进行以允许这3个项目的灵活排序。这样可以在名称中包含多个标签,但仅捕获最后一个。

相关问题