2013-11-29 5 views
1

У меня есть список имен файлов, как это:Лучшего способа получить часть строки с заводной

"XX111NO_1_myText.txt" 
"AABBBAAABBB_25_myHtml.html" 
"VVHHY_6_myLog.log" 

Я хочу, чтобы получить только определенную часть этой строки иметь:

"myText" 
"myHtml" 
"myLog" 

Я реализовал этот код и его работы:

def fileName = "XX111NO_1_myText.txt" 

fileName = fileName.substring(fileName.lastIndexOf(fileName.find(/_[1-9]+_/))+fileName.find(/_[1-9]+_/).length() , fileName.lastIndexOf(".")) 

assert fileName == "myText" 

есть ли лучший способ выполнить эту задачу? Например, используя только регулярное выражение

Благодарности

ответ

2

Вы можете использовать регулярное выражение:

def names = [ "XX111NO_1_myText.txt", 
       "AABBBAAABBB_25_myHtml.html", 
       "VVHHY_6_myLog.log", 
       "bad.data" ] 

def matches = names.collect { 
    (it =~ /^.+_(\S+)\.\S+$/).with { m -> 
     m.matches() ? m[ 0 ][ 1 ] : null 
    } 
} 

assert matches == [ 'myText', 'myHtml', 'myLog', null ] 
+0

Спасибо, я должен узнать больше о регулярном выражении. – Jils

+0

Это в основном ищет начало строки '^', за которой следуют некоторые символы '. +', За которым следует символ подчеркивания '_', за которым следуют некоторые символы без пробелов (которые мы хотим захватить)' (\ S +) 'follow через точку '\ .', за которой следуют некоторые небелые символы' \ S + ', за которыми следует конец строки' $ ' –

+0

Я немного изменил ваш шаблон /^.+_ [1-9] + _ (\ S +) \. \ S + $ /. , чтобы избежать соответствия имени файла: «XXX.XXXX_13.XXXX.txt» – Jils

Смежные вопросы