正则表达式非连续字符

bja*_*obs 1 regex

目前我有:

[A-Za-z0-9._%+-]
Run Code Online (Sandbox Code Playgroud)

这匹配包含字母,数字和某些特殊字符的任何字符串(._%+-)

如何更改此值以使其不会与包含特殊字符的字符串连续匹配?

举例来说,我希望它匹配: foo.bar+testfoo.+bar+foo.

但不是: foo..bar+testfoo.bar++testfoo.bar++

Bar*_*ers 7

如果您的工具/语言支持预览,请尝试:

^(?!.*([._%+-])\1)[A-Za-z0-9._%+-]+$
Run Code Online (Sandbox Code Playgroud)


Ben*_*ank 5

^(?:[0-9A-Za-z]+|([._%+-])(?!\1))+$
Run Code Online (Sandbox Code Playgroud)

分解:

  • (?:... )+-一个或多个的任一
    • [0-9A-Za-z]+— 一个或多个字母数字字符
    • ([._%+-]) — 任何允许的非字母数字
      • (?!\1) — 后面没有完全相同的字符

允许:

  • foo
  • foo.+bar
  • -700.bar+baz

不允许:

  • foo..bar
  • foo.+bar--baz

它的工作原理是在\1每次匹配外部而非捕获组时将匹配的非字母数字字符捕获到第一个反向引用 ( ) 中,并使用负前瞻 ( (?!)) 确保同一字符不会连续出现两次. 请注意,并非所有正则表达式风格都支持负前瞻!