2010-01-11 259 views
0

我有HTML,它具有項目的權重。正則表達式來獲取體重

<div><b>Item Weight (0.51 lbs in Warehouse 3)</b></div> 

我需要一個正則表達式來獲得重量和度量單位。

所以在上面的HTML,我需要0.51lbs

我使用Java,我有一個輔助方法,只需要獲得正則表達式下來吧!

String regexPattern = ""; 

String result = ""; 

Pattern p = Pattern.compile(regexPattern); 
Matcher m = p.matcher(text); 

if(m.find()) 
    result = m.group(1).trim(); 
+4

不要對HTML使用正則表達式。 – 2010-01-11 23:03:24

+0

這不是匹配或解析標記,它是*標記中的文本*。 – brianary 2010-01-11 23:47:19

+0

+1 - 僅僅因爲我認爲你不配得下投票。 – 2010-01-19 19:30:32

回答

0

什麼:

((?:\d+\.)?\d+ \w{3}) 
+0

這隻適用於lbs,如果他想捕捉那部分數據,我猜測可能有其他形式的測量(例如kg)。 – 2010-01-11 23:05:55

+0

對於需要小數點的事實或單位需要長度爲3個字符的事實並不着迷。 – danben 2010-01-11 23:06:27

+0

太棒了!你不能只抓住所有的數據,也許沒有小數?或者沒有小數的工作嗎? – mrblah 2010-01-11 23:07:51

3

這應該做的伎倆

(\d*\.?\d+)\s?(\w+) 

的第一場比賽將是權重和第二將是衡量單位

+0

這是否適用於單數位權重? – Roman 2010-01-11 23:29:54

+0

@Roman - 不,您需要將第一個\ d +更改爲\ d *。 – 2010-01-11 23:33:15

+0

好電話史蒂夫! – 2010-01-12 00:16:20

-1

爲什麼使用正則表達式?由於您始終依賴於某種格式,因此您還可以假設最後一個括號是重量和位置,並且重量和測量單位始終格式如此,例如,與空間。

@Test 
public void testParseWeight() throws Exception { 
    String input = "<div><b>Item Weight (0.51 lbs in Warehouse 3)</b></div>"; 
    int startPos = input.lastIndexOf('('); 
    int space = input.indexOf(' ', startPos); 
    String weight = input.substring(startPos + 1, space); 
    String uom = input.substring(space + 1, input.indexOf(' ', space + 1)); 
    Number parse = NumberFormat.getNumberInstance(Locale.US).parse(weight); 
    assertEquals(0.51d, parse.doubleValue(), 0.0d); 
    assertEquals("lbs", uom); 
} 
+0

好吧,我確實有整個HTML,這只是一個片段! – mrblah 2010-01-11 23:19:04

+1

我假設你能夠識別包含重量的元素。否則,如果你使用正則表達式進行html解析,你將會失敗。 – mhaller 2010-01-11 23:22:30

1

這是我想出了:

\((?<Weight>\d*\.?\d+)\s(?<Unit>\w+) 

這將返回重量組「重量」和度量組「單位」的單位。這將使用或不使用小數。

有我做了幾個假設:

  • 重量必須立即第一個括號後上市。
  • 重量與計量單位之間必須有空格。

如果這些假設並不總是準確的,那麼正則表達式將需要更多的調整。

-1

你不應該使用正則表達式的HTML ...一個更好的猜測是(通過jaxen例如)使用的解析器(如NekoHTML),使用XPath

+0

他沒有解析HTML。他正在提取一個字符串中的數字,恰好在HTML中。反射「正則表達式和HTML不好」的反應在這裏太強大了。 – McPherrinM 2010-01-12 01:26:22

0

將「重量」永遠是字符串?如果是這樣,有較好的正則表達式爲:?

重量*(\ d +(?:?:\ \ d +))\ S +(\ w +)

我想這是在Java中的正則表達式有效,如它在Perl中工作。以上假定權重< 1將被格式化爲0.X。如果他們可以從小數開始,使用這個:

重量。 ?(\ d。?\ d +)?)\ S +(\ w +)

2

,如果你知道單位事前,指定的單位列表可以提供更好的結果:

([\d.]+)\s+(lbs?|oz|g|kg) 
+0

什麼是「?」 「lbs」是什麼意思?爲什麼在「盎司」之後沒有人......等等? – 2015-07-26 12:15:03

+0

在正則表達式中,?意味着「前一個標記是可選的」。在這種情況下,這意味着's'是可選的,因爲你會寫「1磅」和「2磅」。我想你可以爲所有單位添加一個可選項,但根據我的經驗,「磅」更常用於複數形式。 – Jimmy 2015-07-26 22:54:10

1

我想你想的模式是:

(\d*\.?\d+)\s*(lbs?|kg) 

正如Jimmy所指出的那樣,這樣可以得到正確的數字,並且應該將其與實際測量結果進行比較,以便將您的匹配限制爲衡量體重的措施(或其他您所關心的措施)。

+0

它還採取措施有和沒有間距。它只是工作! :) +1 – GTodorov 2017-06-28 02:36:12