我在使用正则表达式时遇到问题。希望有人能帮助或指出正确的方向。从本质上讲,我必须验证路径结构。
有效输入我的方法的规则是:
- (包括正斜杠)以/usersname/开头
- 必须仅出现/usersname/一次
- 在/usersname/出现一次之后,必须只有一个[aphnumeric-space].xml
例如,以下是我的方法的有效输入:
/norrisc/thesf6457.xml
/norrisc/thess63-57.xml
/norrisc/thqsf64-57 gdhy.xml
/norrisc/ase45tg_3.xml
并且以下是*in*方法的有效输入:
/norrisc/anotherFolder/thesf6457.xml
/norrisc/norrisc/thess63-57.xml
/norrisc/norrisc/thess63-57.txt
/norrisc/norrisc/thess63-57
/norrisc/thqsf64-57 gdhy.xml/kjhfsd.xml
到目前为止我的努力(没有结果)是。。
b[/username/]{1}^[a-zA-Z0-9_\s-]+$.xml
^[/username/]{1}[a-zA-Z0-9_\s-]+$.xml{1}
b/username/{1}[a-zA-Z0-9_\s-]+$.xml{1}
希望有人能帮忙?
非常感谢
这对我的测试用例有效:
^/username/(?!.*/)(w|s|-)+.xml$
其中username
显然是字面上的用户名或包含它的变量
把它分解。。。
^
-字符串的开头/username/
-用/
括起来的文字用户名(?!.*/)
-负前瞻:确保字符串的其余部分不包含另一个/
(w|s|-)+
-一个或多个字母、数字、空格、_
或-
.xml
-文字.xml
$
-字符串末尾
如果您不熟悉lookahead,(?=)
结构允许您使用零宽度断言进行匹配。例如,(?=a)
会尝试识别a
字符,但不会将其作为匹配的一部分(这就是"零宽度"的含义——^
和$
是零宽度断言的其他示例)。这被称为正向前瞻,在某种意义上可以让您"跳过"字符。
(?!)
执行相同的操作,但检查指定的模式是否存在。这被称为负面展望。因此,在上面的正则表达式中,(?!.*/)
查找.*/
模式,这意味着"后面跟着斜杠的任何或零个字符"。如果它发现了这一点,例如在字符串/username/another_username/whatever.xml
中,匹配将不会成功(因为前瞻是负)。