我有以下表格格式:
<td class="text-right"
onmouseenter="$(this).find('.overlay-viewable-box:first').show();"
onmouseleave="$(this).find('.overlay-viewable-box:first').hide();">
2.004
</td>
它也包含空格和换行符。 class =&#34; text-right&#34;在页面上不是唯一的,但第一个 - 如果它可以帮助关联它。
我想只匹配数字(这一个 - 2.004,或任何其他,它总是只有一个数字) - 包含或不包含点和/或逗号。
PS :是的,我完全同意用正则表达式解析html的想法并不是最好的 - 任何其他方法都会是这样的开销,它不值得做:(
PPS:男人和男孩 - 请把你的建议写成答案,而不是评论,所以我可以接受并尊重他们。 解决方案:(?:<td\b.*?text-right\b.*?\D*?;">)([\s\S\d]*?)(?=\D*?<\/)
修改:全长HTML:
<div class="box " >
<div class="box-head " >
<div class="box-icon">
<span class="icon "></span> </div>
<span class="divider"></span>
<div class="box-title box-title-space-1">
<span>Keyword-Profile</span></div>
<div class="box-options dropdown box-options-no-divider">
<div class="divider "></div>
<div class="box-icon "><a
class="button">
<span class="icon "></span> </a></div>
<ul class="dropdown-menu">
<li
> <a onclick="" class="modal"><div><div class="icon"><div></div></div><div class="text"> Add to Dashboard</div></div></a>
</li>
<li
><span class="box-menu-seperator"></span> <a onclick="
" href="" class="modal"><div><div class="icon"><div></div></div><div class="text"> Add to Report</div></div></a>
</li>
</ul>
</div>
</div>
<div class="module-loading-blocker">
<div class="module-loading-blocker-icon">
<div style="width: 40px; height: 40px; display: inline-block;">
<svg width="100%" height="100%" class="loading-circular" viewBox="0 0 50 50">
<circle class="loading-path" cx="25" cy="25" r="20" fill="none" stroke-width="5" stroke-miterlimit="10"/>
</svg>
</div> </div>
</div>
<div class="box-content box-body box-table" > <table class="table table-spaced">
<tr>
<td>
Top-10
</td>
<td class="text-right"
onmouseenter="$(this).find('.overlay-viewable-box:first').show();"
onmouseleave="$(this).find('.overlay-viewable-box:first').hide();">
2.004
</td>
</tr>
<tr>
<td>
Top-100
</td>
<td class="text-right"
onmouseenter="$(this).find('.overlay-viewable-box:first').show();"
onmouseleave="$(this).find('.overlay-viewable-box:first').hide();">
237.557
</td>
</tr>
<tr>
<td>
∅ Position
</td>
<td class="text-right"
onmouseenter="$(this).find('.overlay-viewable-box:first').show();"
onmouseleave="$(this).find('.overlay-viewable-box:first').hide();">
60
</td>
</tr>
</table>
</div></div><div class="module" style="display: none;">x</div>
答案 0 :(得分:1)
<td>
忽略事实代码将无法正常运行,并提供一个正则表达式,只会在第一个td.text-right
中获得 的数量:
/(?:<td\b.*?text-right\b.*?\D*?)([0-9]+?[.,]*?[0-9]*?)(?=\D*?<\/)/
| 1 |] = ------------------------------------- = [| 2 | ] = ----------------------- = [| 3 |] = ------------ = |]
开始非捕获 (?:
文字 <td
字边框d \ s&amp;零到任意数量的字符,直到 \b.*?
字面 text-right
字边框t \ s&amp;零到任意数量的字符,直到 \b.*?
零到任意数量的字符,直到 \D*?
结束非捕获 )
开始捕获 (
一个到任意数量的数字,直到 [0-9]+?
为零到任意数量的文字。或者,直到 [.,]*?
0到任意数量的数字,直到 [0-9]*?
结束捕获 )
开始正向展望 (?=
为零到任意数量的任何非数字字符,直到 \D*?
字面值转发正斜杠 <\/
结束积极展望 )
这一点集中在这样一个事实,即每个目标都位于最后一列,方法是向前添加<\/td>\s*?</tr>
。
/\b([0-9]+?[.,]*?[0-9]*?)(?=\D*?<\/td>\s*?<\/tr>)/g;
它具有更清晰的结果,匹配和捕获组都是相同的。没有副作用的非捕获组。
var rgx = /\b([0-9]+?[.,]*?[0-9]*?)(?=\D*?<\/td>\s*?<\/tr>)/g;
var str = document.documentElement.innerHTML;
let hits;
while ((hits = rgx.exec(str)) !== null) {
if (hits.index === rgx.lastIndex) {
rgx.lastIndex++;
}
hits.forEach(function(hit, idx) {
console.log(`Found match, group ${idx}: ${hit}`);
});
}
<div class="box ">
<div class="box-head ">
<div class="box-icon">
<span class="icon ">&f0ae;</span> </div>
<span class="divider"></span>
<div class="box-title box-title-space-1">
<span>Keyword-Profile</span></div>
<div class="box-options dropdown box-options-no-divider">
<div class="divider "></div>
<div class="box-icon ">
<a class="button">
<span class="icon ">&f013;</span> </a>
</div>
<ul class="dropdown-menu">
<li>
<a onclick="" class="modal">
<div>
<div class="icon">
<div>&f055;</div>
</div>
<div class="text"> Add to Dashboard</div>
</div>
</a>
</li>
<li><span class="box-menu-seperator"></span>
<a onclick="
" href="" class="modal">
<div>
<div class="icon">
<div>&f055;</div>
</div>
<div class="text"> Add to Report</div>
</div>
</a>
</li>
</ul>
</div>
</div>
<div class="module-loading-blocker">
<div class="module-loading-blocker-icon">
<div style="width: 40px; height: 40px; display: inline-block;">
<svg width="100%" height="100%" class="loading-circular" viewBox="0 0 50 50">
<circle class="loading-path" cx="25" cy="25" r="20" fill="none" stroke-width="5" stroke-miterlimit="10"/>
</svg>
</div>
</div>
</div>
<div class="box-content box-body box-table">
<table class="table table-spaced">
<tr>
<td>
Top-10
</td>
<td class="text-right" onmouseenter="\$(this).find('.overlay-viewable-box:first').show();" onmouseleave="\$(this).find('.overlay-viewable-box:first').hide();">
2.004
</td>
</tr>
<tr>
<td>
Top-100
</td>
<td class="text-right" onmouseenter="\$(this).find('.overlay-viewable-box:first').show();" onmouseleave="\$(this).find('.overlay-viewable-box:first').hide();">
237.557
</td>
</tr>
<tr>
<td>
∅ Position
</td>
<td class="text-right" onmouseenter="\$(this).find('.overlay-viewable-box:first').show();" onmouseleave="\$(this).find('.overlay-viewable-box:first').hide();">
60
</td>
</tr>
</table>
</div>
</div>
<div class="module" style="display: none;">x</div>
答案 1 :(得分:0)
一个简单的解决方案,前提是您的解析引擎可以跨行搜索,并支持外观:
(?<=>\s*)([0-9]+(?:\.[0-9]+)?)(?=\s*<)
说明:
第一部分是(?<=>)
。 (?<=regex)
被称为正向后视,它告诉解析器在实际匹配部分之前检查是否存在匹配 regex 的模式。在这种情况下,它将在>
之后查找任意数量的空格。
核心部分[0-9]+(\.[0-9]+)?
匹配一个或多个数字,可选地后跟一个点和另一个一个或多个数字组。最后一个?
表示小数部分是可选的。
最后一部分是(?=<)
。 (?=regex)
被称为正向前瞻,它告诉解析器在实际匹配部分之后检查是否存在匹配 regex 的模式。在这种情况下,它将查找任意数量的空格,然后是<
。
答案 2 :(得分:0)
假设您的正则表达式引擎了解pcre,请尝试
/>[\s]*([[:digit:]]+(\.[[:digit:]]+)?)[\s]*<\//g
匹配一个可选的空格包围的数字(包括换行符/换行符),这是html元素的唯一文本内容。捕获组1保留该数字。
您可能需要调整捕获组内的模式,以满足您认为是“数字”的词类型。
如果假设的结构html上下文对您的目的过于严格,则删除表达式的开头和结尾(即>
,<\/
)。鉴于您的问题,您意识到这样做会增加误报的风险。
顺便提一下,大多数编程语言都有html解析器库,可以解析宽松的语法错误,并通过简单的界面迭代所有文本内容。仅仅为了论证,如果jQuery或某些类似的功能可用,你可以继续this SO answer的行(只需用正则表达式测试替换内部return
表达式,如(未经测试的代码) :
var re = RegExp('[[:digit:]]+(\.[[:digit:]]+)?', 'g');
$.fn.findByREText = function (re) {
$('*').contents().filter(function () {
return re.test($(this).text.trim());
});
};