2011-01-19 209 views
0

目前我有:正則表達式不連續的字符

[A-Za-z0-9._%+-] 

這包含字母,數字和某些特殊字符(._%+-

任意字符串匹配

我怎樣才能改變這種做法,它贏得了」 t是否匹配連續包含特殊字符的字符串?

舉例來說,我希望它匹配: foo.bar+testfoo.+bar+foo.

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

+0

其他情況:應該`+ foo.bar`,`FOO +。酒吧「或」foo.bar +「匹配? – 2011-01-19 19:15:05

+0

@Ben:顯然不是第二個。 – SilentGhost 2011-01-19 19:17:29

+0

@SilentGhost - 他的例子連續顯示兩個*相同*特殊字符,所以我認爲這值得提問。 ;-) – 2011-01-19 19:19:47

回答

6

如果您的工具/語言支持一下aheads,嘗試:

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

如何:

^(?!.*[._%+-]{2})[\w.%+-]+$ 

如果只相同的字符不能重複使用:

^(?!.*([._%+-])\1)[\w.%+-]+$ 
4
^(?:[0-9A-Za-z]+|([._%+-])(?!\1))+$ 

拆毀了

  • (?: ...... )+ - 一個或多個要麼
    • [0-9A-Za-z]+ - 一個或多個字母數字字符
    • ([._%+-]) - 任何允許的非字母數字
      • (?!\1) - 這之後不是完全相同的字符

允許:

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

組合不允許:

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

它通過捕獲匹配的非alphanum eric字符轉換爲第一個反向引用(\1),每次外部未捕獲組匹配並使用負向預讀((?! ... ))以確保相同的字符不會連續出現兩次。請注意,並非所有正則表達式都支持負面預測!

0

使用PHP的PCRE,你可以這樣做:

/^([A-Za-z0-9]|([._%+-])(?!\2))*$/ 

\2是的需要的檢測相同符號的重複使用背參考。我不知道這是可能做到這一點沒有向前斷言和反向引用,所以我對測試工作正則表達式:

'foo'   => true, 
'bar.baz'  => true, 
'bar.biz.buz' => true, 
'bar.+bar' => true, 
'bar..bar' => false, 
'biz.baz..' => false, 
'..++..'  => false, 
'.faf.'  => true,