2014-01-29 118 views
3

我需要驗證文件輸入,以確保它有它的正確版本的中間匹配的字符串。這例如是輸入文件:W:\\folder\\test_v2301_01_29_2014_1420.pfd使用Java的正則表達式來查找字符串

我已經在Java中構建了一個正則表達式來查找我正在查找的用於驗證文件的版本控制字符串。

正則表達式:v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}但是,它失敗了,因爲正則表達式正在查看文件的開始。

叫:if (!arcvalFileFormBean.getTxtFileReview().matches("v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}"))

什麼是搜索的字符串不知道它會從一開始就多遠的最佳方式?

回答

2

試試這個:

if (!arcvalFileFormBean.getTxtFileReview().matches(
       ".*?v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}.*")) 

String#matches嘗試您的版本正則表達式和.*後,在此之前完成輸入,因此.*?匹配將確保這種模式在輸入的任何地方匹配

+0

工作就像一個魅力。謝謝!我會在9分鐘內給出答案。 – staples89

+0

不客氣,很高興它解決了。 – anubhava

0

您可以先編譯模式,然後創建一個匹配器實例,然後在返回的匹配器上調用find(),而不是向RegEx添加前導和尾隨匹配所有參數。

Pattern pattern = Pattern.compile("v[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{4}_[0-9]{4}"); 
Matcher matcher = pattern.matcher(arcvalFileFormBean.getTxtFileReview()); 

if (!matcher.find()) { 
    ... 
} 

匹配器還提供了一個matches()操作雖然這表現爲在它只返回的情況下,真正的整個字符串的正則表達式匹配字符串的匹配功能。

的圖案/匹配器構建體可用於發現如果特定子串的模式匹配,並且如果是這樣替換此字符串的某些部分。即我們使用這種方法,以掩蓋日誌語句某些密碼使用定製的logback CompositeConverter包含像下面描述的類似的邏輯:

Pattern urlAuthPattern = Pattern.compile("//(.*?):.*[email protected]"); 
Matcher matcher = urlAuthPattern.matcher("ftp://user1:[email protected]:21/path/to/somewhere"); 
if (matcher.find()) { 
    // should return ftp://user1:[email protected]:21/path/to/somewhere 
    return matcher.replaceAll("//$1:[email protected]"); 
} 
相關問題