2015-07-10 40 views
3

我是相當新的正則表達式,並試圖匹配的字符串拒絕特定的正則表達式模式

  • 可以有任意長度
  • 可以是字母數字,也可以包含$-,或/
  • 在一行中不能包含兩個以上的非字母數字字符或以/-結尾。

例如,Hello/World有效,Hello//World無效。

我已經嘗試了幾個不同的可能性,用這一個來最接近的工作,我很期待:

^--|-/|/-|\s\s|$$|$-|-$|$/|/$|//|([a-zA-Z0-9 -$/])*(?<![/-])$ 

這似乎是足夠的,除了當兩個斜槓在一起的每一個場景。是否需要轉義正斜槓,還是因爲我的匹配表達式太寬而吞嚥了糟糕的字符串?我已經嘗試了各種其他表達方式,但是它們都遇到了問題,尤其是帶有錯誤否定的問題。

乾杯,

傑夫

+0

什麼語言/工具串(在matches()不必要的)的終結? – anubhava

+0

正斜槓不需要轉義,除非使用斜槓作爲分隔符時,在這種情況下可以使用,並且只需更改分隔符或使用/ {2}即可。我的方法是開發一個正則表達式,以匹配每個模式排除,然後或他們在一起,把一個!在它的前面,所以你只有在沒有任何排除模式匹配的情況下才能進行匹配。這將具有!(r1 | r2 | ... | rn)的形式,其中r1,r2 ... rn是要排除的模式的正則表達式。 – 2015-07-10 19:22:51

+0

使用Java,但我一直在試圖通過使用RegexPlanet來解決問題。我會嘗試你的建議Tris,看看是否有效。 –

回答

1

這裏是正則表達式,你正在尋找:

^(?![^/$-]*[/$-]{2})[\w/$-]+(?<![/-])$ 

Regex DemoIDEONE Java Demo

String str1 = "Hello/World"; 
String str2 = "Hello//World"; 
String ptrn = "^(?![^/$-]*[/$-]{2})[\\w/$-]+(?<![/-])$"; 
System.out.println(str1.matches(ptrn)); // => true 
System.out.println(str2.matches(ptrn)); // => false 

說明:

  • ^ - 字符串的開始(在matches()不必要的)
  • (?![^/$-]*[/$-]{2}) - 前瞻確保字符串具有不超過1個非字母數字字符
  • [\w/$-]+ - 主要字符類匹配字母數字字符和/$-
  • (?<![/-]) - 一個回顧後,確保該字符串不以結束禁非字母數字字符
  • $ - 您使用
+1

非常有趣的問題,我應該說!大多數此類情況通常可能與[look-around](http://www.regular-expressions.info/lookaround.html)(http://www.regular-expressions.info/lookaround.html)一起使用,我正在使用前瞻和後退來設置您定義的限制。 –

+0

非常感謝您的解釋!這很好用! –

1

你是負向前看符號在正確的道路上,你只需要包括捕獲組參考。

^([^\$-\/]|([\$-\/])(?!\2))+?[^\/-]$

此正則表達式做了負向前查找任何$, - ,或/它抓住。它也有一個懶惰的量詞,以確保它不會覆蓋檢查結尾/或 - 。