2012-04-10 92 views
0

我試圖在java中「查找」非常特定的一系列字符,但是我的正則表達式無法正常工作。我想查找一個單詞(任何單詞),然後是一個空格,然後是一個正向空格,然後是另一個空格,然後是'M'(小寫或大寫),然後是一系列數字。我正在使用以下行:使用正則表達式找不到一個單詞

Elements rating = doc.getElementsMatchingText(Pattern.compile("\\b\\s/\\s[mM][0-9]+")); 

但是,這是查找整行(預期模式之前和之後的單詞)。這也於事無補:

Elements rating = doc.getElementsMatchingText(Pattern.compile("^\\b\\s/\\s[mM][0-9]+"));  

我在做什麼錯?

+0

那麼,你想從你提供的模式中得到什麼?您沒有任何捕獲組,因此您只能檢查模式是否在某些文本中找到,而不是從生成的匹配器中提取特定數據。 – 2012-04-10 16:09:24

+0

嘗試'\ w +'而不是'\ b'。 – jon 2012-04-10 16:10:30

+0

請勿發佈ddoouubbllee - eessccaappeedd Java。發佈您的預期輸入和您的預期結果,以及您正在使用的模式。 – tchrist 2012-04-10 16:20:54

回答

-1

關於正則表達式,嘗試用:

* \ [MM] [1-9] *

我用http://rubular.com/測試我正則表達式,所以你可以讓你的實驗。

再見

+0

爲什麼有人會使用Ruby來測試Java模式? – tchrist 2012-04-10 16:21:38

+0

首先,因爲它是我發現的第一個正則表達式測試器:P我認爲java和ruby中的基本級正則表達式是相同的。 – Simone 2012-04-11 09:41:18

+0

我修改了我的java正則表達式。* \\ [Mm] [1-9] *。*,它似乎工作,但它找到了整條線。我不是專家,所以對我的回答感到抱歉 – Simone 2012-04-11 09:50:25

2

您的情況下,正確的模式是\\b\\w+\\s/\\s[mM][0-9]+

但是,您描述的問題與您使用的API相關,而不是與模式相關。 請注意,getElementsMatchingText不允許您訪問匹配詳細信息,因此您無法提取與該模式匹配的部分文本。

您需要手動遍歷doc的所有元素,並應用Matcher.find()每個元素的文本,或者乾脆重新申請Matcher.find()用相同的模式,以通過getElementsMatchingText返回元素的文本。然後你就可以將匹配的部分提取爲Matcher.group()

+1

我不認爲模式看起來正確;例如,'\ b \ s'只會匹配一個Unicode字符後面的ASCII空格。 – tchrist 2012-04-10 16:23:28

0

你的正則表達式是有缺陷的。我建議

\w+/[Mm]\d+ 

(記得要適當地逃跑的時候你把一個java字符串)

有幾件事情對你的正則表達式:

1)您沒有什麼目前匹配「單詞(任何單詞)」(!!!)我選擇了\ w +以僅與至少一個單詞字符匹配單詞。您可以執行像\ w {2,10}這樣的操作來處理2到10個字符之間的單詞,例如,如果您想進一步自定義。

2)你並不需要在所有因爲\ W *匹配只匹配有效字字符

3 \ B)牢記\ S可以匹配不僅僅是一個空間更多..我只使用一個空間,但可以把在\■如果確定與它匹配的選項卡,新的線(如果配置這樣)等

4)我認爲\ d是更慣用的和比可讀[0-9]

+1

這沒有任何意義。所謂的不捕捉團體完全無關緊要。 – tchrist 2012-04-10 16:20:07

+0

@tchrist - doh,你說的\ b表達式是正確的。也許本應該從頭開始,清醒頭腦,而不是調整表達式:)。將編輯,謝謝! – 2012-04-10 16:26:17

+0

至於你的觀點2,'\ b \ w + \ b'和'\ w +'之間確實存在細微的差別:前者要求邊界在兩邊,後者不需要邊界,所以在複雜的情形下匹配像「peek」這樣的字符串的內部,就像double-e一樣。前者不能。然而,Java的''b'和'\ w'(和'\ s'等)**相對於另一個**是完全被破壞的,除非你使用新的Java-7'UNICODE_CHARACTER_CLASS'或嵌入的'( ?U)'模式編譯標誌。 – tchrist 2012-04-10 16:44:12