2014-03-27 74 views
0

只是試圖獲得更多的正則表達式的經驗(同時也使工作更輕鬆),我試圖解析Java中的一些文件名。正則表達式匹配Ruby,但不是Java?

我的字符串是這樣的:/home/user/example/Results/ExampleFilePrefix_20140324-0500_OptionalTextThatMightContainNumbers123.csv

基本的文件名總是以ExampleFilePrefix_其次是時間戳開始,有時OptionalTextThatMightContainNumbers123只是取決於是如何生成的文件結束。我想要的相關信息是時間戳,如果存在,則選擇性文本。

我瞎搞與各種正則表達式,雖然我可以讓他們全部用Ruby的正則表達式解析器來工作,我不能讓任何人在Java中工作。我沒有跟蹤他們,因爲我去了,但是這是我最近的嘗試:

_(\w+-\w+)

如預期在Ruby中其中一期工程:http://rubular.com/r/K2BiboURRo,但即使不來接近Java的匹配: http://fiddle.re/c7m04

我不認爲這是我寫的代碼,因爲在線解析器不匹配的問題,但我會將其粘貼到此處以確保。

private String extractFileName(String filename) { 
    String resultNameBase = "RegexDidntMatch"; 
    Pattern pattern = Pattern.compile("_(\\w+-\\w+)", Pattern.CASE_INSENSITIVE); 
    Matcher matcher = pattern.matcher(filename); 
    if (matcher.matches() && matcher.find()) { 
     resultNameBase = matcher.group(1); 
    } 
    return resultNameBase; 
} 

一如往常,感謝所有提前

+0

它的工作原理完全一樣的[文件](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#matches())在Java中說: - '嘗試將整個區域對pattern' – FrankieTheKneeMan

回答

2

其僅matcher.find()而捕獲的第一組0而不是1

if (matcher.find()) { 
    resultNameBase = matcher.group(); 
} 
+0

看起來這是我最初的問題相符,但我最近正則表達式也是不完善的。我可以改變我的正則表達式來後能得到正確的匹配'_(\\ d + - \\ w +)'。在這一點上,我可以匹配第1組,而第0組不會阻礙領先_而第0組。 –

2

這部分問題:

if (matcher.matches() && matcher.find()) 

Matcher#matches()完全匹配輸入字符串與正則表達式。

替換有:

if (matcher.find())