验证比我想要的更多的 PCRE 模式

PCRE pattern that validates more than I wants

为了开发一个网络应用程序的路由模块,我不得不大量使用正则表达式。 我必须测试以下形式的 URI:

/Services/service_name/List/of/Parameters/or/nothing

服务名称是必填项,但不是行尾参数。 该行可以以斜杠结尾,也可以不以斜杠结尾。 除字母数字字符外,参数只能包含特殊字符 -_.

这里是有问题的表达式:

(?:\/Services\/(?'var'[[:alnum:]_-]+)|\G(?!\A))(?:\/(?'params'[[:alnum:]_-]+))?

Demo on regex101

你看,如果我们在链的末尾添加 + 它仍然有效,但它不应该有效。

如果字符串以斜线或字母数字结尾,您可以在开头使用正向预测 (?=.*(?:\/|[[:alnum:]_-])$) 强制匹配字符串:

(?=.*(?:\/|[[:alnum:]_-])$)(?:\/Services\/(?'var'[[:alnum:]_-]+)|(?<!^)\G)\/(?:(?'params'[[:alnum:]_-]+))?

请注意,我使用的是多行模式,假设您将这些字符串作为单独的实体。

demo