目前我有:正則表達式不連續的字符
[A-Za-z0-9._%+-]
這包含字母,數字和某些特殊字符(._%+-
)
我怎樣才能改變這種做法,它贏得了」 t是否匹配連續包含特殊字符的字符串?
舉例來說,我希望它匹配: foo.bar+test
和foo.+bar
和+foo.
但不是: foo..bar+test
或foo.bar++test
或foo.bar++
目前我有:正則表達式不連續的字符
[A-Za-z0-9._%+-]
這包含字母,數字和某些特殊字符(._%+-
)
我怎樣才能改變這種做法,它贏得了」 t是否匹配連續包含特殊字符的字符串?
舉例來說,我希望它匹配: foo.bar+test
和foo.+bar
和+foo.
但不是: foo..bar+test
或foo.bar++test
或foo.bar++
如果您的工具/語言支持一下aheads,嘗試:
^(?!.*([._%+-])\1)[A-Za-z0-9._%+-]+$
如何:
^(?!.*[._%+-]{2})[\w.%+-]+$
如果只相同的字符不能重複使用:
^(?!.*([._%+-])\1)[\w.%+-]+$
^(?:[0-9A-Za-z]+|([._%+-])(?!\1))+$
拆毀了
(?:
...... )+
- 一個或多個要麼:
[0-9A-Za-z]+
- 一個或多個字母數字字符或([._%+-])
- 任何允許的非字母數字
(?!\1)
- 這之後不是完全相同的字符允許:
foo
foo.+bar
-700.bar+baz
組合不允許:
foo..bar
foo.+bar--baz
它通過捕獲匹配的非alphanum eric字符轉換爲第一個反向引用(\1
),每次外部未捕獲組匹配並使用負向預讀((?!
... )
)以確保相同的字符不會連續出現兩次。請注意,並非所有正則表達式都支持負面預測!
使用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,
其他情況:應該`+ foo.bar`,`FOO +。酒吧「或」foo.bar +「匹配? – 2011-01-19 19:15:05
@Ben:顯然不是第二個。 – SilentGhost 2011-01-19 19:17:29
@SilentGhost - 他的例子連續顯示兩個*相同*特殊字符,所以我認爲這值得提問。 ;-) – 2011-01-19 19:19:47