2012-05-08 119 views
0

我不習慣他們,並與Java語法「匹配」的麻煩。多個正則表達式

我有兩個文件一個是111.123.399.555.xml另一種是Conf.xml.

現在我只希望得到使用正則表達式的第一個文件。

string.matches("[1-9[xml[.]]]"); 

沒有用。

如何做到這一點?

+0

你想'/([1-9] {3} \。){4} XML /'? – Bergi

+1

我寫了一篇[博客文章](http://xisb.wordpress.com/2012/05/09/what-absolutely-every-programmer-should-know-about-regular-expressions/)給出一個真實的簡要概述在正則表達式上,絕對基本的,每個人都應該知道。也許它可以幫助你瞭解更多細節。 – stema

回答

6

使用string.matches("[1-9[xml[.]]]");將不起作用,因爲[]將創建一個字符類組,而不是一個捕獲組。

這意思是說,去渣,你的表情是說"match any of: [1-to-9 [or x, or m, or l [or *any*]]]"(*任何*這裏是因爲你沒有逃脫.,並且,它會創建a match any character命令)


重要:

「\」被java識別爲字面轉義字符,並將其作爲實際匹配器的轉義字符(也是「\」,但是以字符串形式)發送到匹配器,它本身需要被因此,當你在匹配器上使用「\」時,你必須使用「\\」。

這是一個有點混亂,當你不使用它,但概括起來,送一個實際「\」進行匹配的匹配,你可能需要使用「\\\\ 「!第一個「\\」將變成匹配器的「\」,因此一個scape字符,第二個「\\」,第一個將被變成實際的「\」字符串!


正確的模式字符串匹配的###.###.###.###.xml模式,其中「#」始終是數字,是string.matches("(\\d{3}\\.){4}xml"),而且是它的工作原理如下:

  • \\d =將匹配單個數字字符。這與使用[0-9]的 相同,只是更簡單。
  • {3}指定匹配「剛好3次」爲先前的 \\d。因此匹配###
  • \\.匹配單個點字符。
  • 附上前面的代碼的()對匹配器說明「這是一個捕獲組」 。它被下一個{4}使用,從而創建一個「匹配 這整個###.組正好4次」,從而創建「匹配###.###.###.###.」。
  • 最後,模式字符串結束前的xml將匹配 正是「XML」,其中,沿着以前的項目,使得正好符合這一模式:「###.###.###.###.xml」。

進一步學習,閱讀Java's Pattern docs.

+0

非常感謝你! – ctekk

+0

如何使語法也能識別這樣的模式#。#。#。#。xml ??? (也##。#。###。#。xml應該工作等) – ctekk

+1

感謝您的鏈接解決它:「(\\ d + \\。){4} xml」 – ctekk

1
string.matches("[1-9.]+\\.xml") 

應該這樣做。

  • [1-9.]+與1和9和/或句點之間的一個或多個數字匹配。 (+表示「一個或多個」,*表示「零個或多個」,?表示「零個或一個」)。
  • \.xml比賽.xml。由於.意味着正則表達式中的「任何字符」,如果您希望它意味着一個文字週期:\.(因爲它位於Java字符串中,所以反斜槓本身需要加倍轉義),您需要轉義它。
+0

你能向我解釋一下嗎?什麼是「+」和「\\」?還有爲什麼會有「。」裏面的「[1-9]」 – ctekk

+2

閱讀此http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html –

+0

這工作:[1. - 9 。] + \\。xml感謝您的幫助和解釋我會接受它 – ctekk