目前我有:
[A-Za-z0-9._%+-]
Run Code Online (Sandbox Code Playgroud)
这匹配包含字母,数字和某些特殊字符的任何字符串(._%+-)
如何更改此值以使其不会与包含特殊字符的字符串连续匹配?
举例来说,我希望它匹配:
foo.bar+test和foo.+bar和+foo.
但不是:
foo..bar+test或foo.bar++test或foo.bar++
^(?:[0-9A-Za-z]+|([._%+-])(?!\1))+$
Run Code Online (Sandbox Code Playgroud)
分解:
(?:... )+-一个或多个的任一:
[0-9A-Za-z]+— 一个或多个字母数字字符或([._%+-]) — 任何允许的非字母数字
(?!\1) — 后面没有完全相同的字符允许:
foofoo.+bar-700.bar+baz不允许:
foo..barfoo.+bar--baz它的工作原理是在\1每次匹配外部而非捕获组时将匹配的非字母数字字符捕获到第一个反向引用 ( ) 中,并使用负前瞻 ( (?!… )) 确保同一字符不会连续出现两次. 请注意,并非所有正则表达式风格都支持负前瞻!
| 归档时间: |
|
| 查看次数: |
6258 次 |
| 最近记录: |