2013-07-23 76 views
1

我遇到了正則表達式的問題。希望有人能幫助或指出正確的方向。基本上我必須驗證路徑結構。驗證以filename.xml結尾的路徑結構

有效輸入我的方法的規則是:

  1. (包括斜槓)出現一次時後/ usersname/
  2. 只能是一個的/ usersname/
  3. 發生開始的/ usersname /中必須只有一個[aphanumeric-_空間] .XML

因此,例如,以下是有效的輸入到我的方法:

  • /norrisc/thesf6457.xml
  • /norrisc/thess63-57.xml
  • /norrisc/thqsf64-57 gdhy.xml
  • /norrisc/ase45tg_3.xml

..和以下中*有效的輸入被*成方法:

  • /norrisc/anotherFolder/thesf6457.xml
  • /norrisc/norrisc/thess63-57.xml
  • /norrisc/norrisc/thess63-57.txt
  • /norrisc/norrisc/thess63-57
  • /norrisc/thqsf64-57 gdhy.xml/kjhfsd.xml

我的努力(無濟於事)至今都..

  • \b[/username/]{1}^[a-zA-Z0-9_\\s-]+$\.xml
  • ^[/username/]{1}[a-zA-Z0-9_\\s-]+$\.xml{1}
  • \b/username/{1}[a-zA-Z0-9_\\s-]+$\.xml{1}

希望有人能幫助..?

感謝v多少

+0

我不確定正則表達式在這裏是正確的選擇。你可以簡單地用'/'分隔符來分割你的字符串。如果有超過2個值或者第一個值不是用戶名或者最後一個值無效(不以xml結尾或包含無效字符),那麼您的輸入無效,否則它是有效的。 – halflings

+0

我不知道@halflings,如果你很喜歡用這個正則表達式,我不認爲有一個*好*理由不會(我可能不會像這樣簡單的東西)。它肯定會像分割字符串一樣工作,所以它取決於個人偏好或與其餘代碼最適合的方式。如果他們已經使用正則表達式來驗證所有的東西,那麼正則表達式可能是最好的選擇。 – sgroves

+0

是的。但很明顯,遵循「天真」的方法(使用令牌)會爲OP節省很多麻煩。此外,這將使他的代碼更易於維護。 (但這可能只是我的反正則表達式 - 無處不在的偏見) – halflings

回答

2

這個工作對我對你的測試用例:

^\/username\/(?!.*\/)(\w|\s|-)+\.xml$ 

其中username,很明顯,是字面的用戶名或含有它的變量。

打破這個...

  • ^ - 串
  • \/username\/的開始 - 字面的用戶名通過/
  • (?!.*\/)封閉 - 負前瞻:確保字符串的其餘部分不包含另一個/
  • (\w|\s|-)+ - 一個或多個字母,數字,空格,_-
  • \.xml - 文字.xml
  • $ - 串

的結束。如果你不熟悉向前看符號,在(?=)結構可以讓你匹配使用零寬度斷言。例如,(?=a)會嘗試識別a字符,但不會將其作爲匹配的一部分包含在內(這就是「零寬度」意味着^$是零寬度斷言的其他示例)。這稱爲積極lookahead並允許您在某種意義上「跳過」字符。

(?!)做同樣的事情,但檢查指定的模式是否不存在存在。它被稱爲負向預測。所以在上面的正則表達式中,(?!.*\/)尋找.*\/模式,這意味着「任何或零個字符後跟一個斜槓」。如果它發現這種情況,例如在字符串/username/another_username/whatever.xml中,則匹配將不會成功(因爲前瞻是負數)。

+0

非常感謝你的迴應..以及對細節的出色解釋。是的,我嘗試了一個字符串tok方法(我使用java),但是如果我能熟練使用reg表達式,我覺得作爲程序員的生活將會得到改善。 – johnm

+0

很高興提供幫助。是的,正則表達式是一個偉大的工具,一定會幫助你成爲一名程序員。它被各種其他語言/工具(如'vi')使用,如果你擅長編寫模式,往往會使某些任務更快。有趣的是,我並沒有在我的實際程序中發現自己使用正則表達式 - 它們更像是一個非常適合* nix命令行的工具,用於加速非編碼部分的工作(快速修剪錯誤日誌例如,直到您需要的線路) – sgroves