2010-01-11 140 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