仅捕获字符串的一部分而不进行格式化

时间:2011-11-01 17:13:47

标签: regex capture

我正试图仅捕获<em>&amp;之间的数字。 </em>个标记,没有<b>&amp;使用基本正则表达式的</b>标记。我试着想办法,也许是外表,但我只是不熟练......但是。以下是原始HTML的示例:

<em>4<b>4</b>9/<b>5</b>-<b>7</b>0</em>

以下是我希望得到的结果:

449570

问题是这些字符串有时会格式化HTML,有时则不然。有时会有额外的-/符号,有时则不会。我正在使用<em>.*<\/em>,这很简单!

感谢您的帮助:)

4 个答案:

答案 0 :(得分:1)

如前所述,正则表达式可能不是最简单的解决方案。但是,如果你真的想要使用它,那么你可能最好两次通过:

echo "<em>4<b>4</b>9/<b>5</b>-<b>7</b>0</em>" | sed 's|<[^>]\+>||g' | sed 's|[^0-9]||g'

第一个sed操作会删除所有html标记。第二个删除所有非数字字符。

答案 1 :(得分:0)

第一:一如既往,你可能不应该在html上使用正则表达式。总会有边缘情况无法捕捉。

如果您使用的是某种类型的纯正则表达式更是如此,并且由于您没有指定其他任何内容,我将假设您正在使用它。所以真的,不要使用正则表达式。

那说,我会做两个正则表达式 - 捕获字符串,然后从捕获的字符串中分出你不想要的任何标记(记得使用非贪婪的匹配来匹配它们!)

答案 2 :(得分:0)

E.g。如果您使用的是javascript,请尝试以下操作:

var str = "<em>4<b>4</b>9<b>5</b><b>7</b>0</em>";
str.replace(/<em>([^e]+)<\/em>/g, function(match, emInner) {
  console.log(emInner.replace(/[^0-9]/g, ''));
});

这会打印449570

答案 3 :(得分:-1)

编辑:<em>(?:(?:<b>)?[0-9]*(?:</b>)?)*</em>

编辑2:<em>(?:\D*(\d+)\D*)*?</em>处理混合中的非数字字符,事实上它看起来比第一个简单:)。