2012-01-25 31 views
0

我有困难的时候创建的正则表达式和JavaScript代码来计算这种模式的出现次数:正则表达式匹配字符串通配符

<tr><td align=right>*</td><td align=right>*</td><td><a href="*">*</a></td></tr> 

其中为*是野生的。

我该如何去寻找?

+1

没有,整个字符串,其中当每个*是一个通配符(可以是什么) – willium

+3

把正则表达式搁置一会儿,你究竟想要达到什么目的? (正则表达式可能不是最好的方法:当然[这不是很好的解析HTML](http://stackoverflow.com/a/1732454/615754)。)你是说你已经在一个字符串中有HTML标记吗? – nnnnnn

回答

0

可以扩大战果,这将匹配任何标签内容:

(?:.*?\>([^\<\>]+)\<) 

而本作中的href匹配:

href\s*=\s*(["']).*?\1 
1

如果你想要做的就是那数出现次数整个模式,你可以尝试:

// basically, numMatches = myString.match(/regexhere/ig).length; 
numMatches = mystring.match(/<tr><td align=right>[\s\S]*?<\/td><td align=right>[\s\S]*?<\/td><td><a href="[^"]+">[\s\S]*?</a><\/td><\/tr>/ig).length; 

正则表达式是上面的字符串,除了:

  • *变成[\s\S]*?。通常,我会替换为.*?,但是在正则表达式.中匹配所有内容,除了换行符。所以,如果你的字符串跨越多行,它将不匹配。解决此问题的常用方法是使用允许.与新行匹配的“dotall”正则表达式修饰符,但JavaScript不支持此功能(?!)。在这种情况下,[\s\S]是一种替代方案。
  • 在正则表达式中逸出/,因为我使用/作为我的javascript的正则表达式分隔符。

注 - 如果您想匹配标签可能分成多行的位置,例如:

<tr> 
    <td align=right>randomstuffhere</td> 
    <td><a href="http://somelink">someotherstuff</a></td> 
</tr> 

然后改变正则表达式,从而有充分的标签,这将允许之间的空白之间的\s*。即:

numMatches = mystring.match(/<tr>\s*<td align=right>[\s\S]*?<\/td>\s*<td align=right>[\s\S]*?<\/td>\s*<td>\s*<a href="[^"]+">[\s\S]*?</a>\s*<\/td>\s*<\/tr>/ig).length; 
0

jQuery的方式(可能不是有效的),

var count = 0; 
$('td[align=right],a[href=*]').each(function(){ 
if($(this).html() == '*'){ 
count++; 
} 
}) 

console.log(count); 
1

乐趣用jQuery:

var $matches = $('td[align=right] ~ td[align=right] ~ td > a') 

$matches.length // the number of matches 
$matches.attr('href') // the value of the anchor's `href` attribute 
$matches.parent().prev().text() // the preceding cell's text 
$matches.parent().prev().prev().text()