正则,匹配一个不包含某些字符的字符串

anjing5566 2009-09-18 04:42:38
是这样的,我要匹配下面中后面的那个table标签,规则要怎么写?
<table border="0" cellspacing="0" cellpadding="0" width="200">

<table border="0" cellspacing="0" cellpadding="0" >

简单讲就是获取不含width的table

我写的规则出错,两个都匹配了

<table[^<>]*?(?!(width))[^<>]*?>


求正解及相应原理
...全文
572 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
anjing5566 2009-09-21
  • 打赏
  • 举报
回复
感谢上面热心的回答,结贴
-过客- 2009-09-19
  • 打赏
  • 举报
回复
原理和排除型字符组是一样的
[^<>]
排除型字符组虽然可以排除一个或多个字符,但排除的只是一个个的字符,而不是字符序列

排除字符序列需要用到顺序环视
1、[\s\S] 任意一个字符
2、(?!width)[\s\S] 一个这样的字符,从这个字符前面的位置开始,右侧不能是width
3、((?!width)[\s\S])符合上面规律的字符任意多个
<table和>之间都是由以上字符组成的,那么它们之间自然不包括width
再综合一下需要考虑的情况,最终的正则就是
var reg = /<table(?:(?!\bwidth\b|>)[\s\S])*>/ig;
-过客- 2009-09-19
  • 打赏
  • 举报
回复
考虑多种情况的话,改进一下

<textarea id="source" rows="10" cols="100"></textarea><br />
<input type="Submit" value="处理" onclick="opt();"><br />
<textarea id="result" rows="10" cols="100"></textarea><br />
<script type="text/javascript">
var str='<table border="0" cellspacing="0" cellpadding="0" width="200">'
+'<table border="1" cellspacing="0" width="200" cellpadding="0" >'
+'<table border="2" cellspacing="0" cellpadding="0" >'
+'<table border="3" cellspacing="0" style="width:100px" cellpadding="0" >'
+'<table border="4" cellspacing="0" cellpadding="0" >'
+'<table border="5" width="100px" cellspacing="0" cellpadding="0" >';
var reg = /<table(?:(?!\bwidth\b|>)[\s\S])*>/ig;
var arr = str.match(reg);
if(arr != null)
{
for(var i=0;i<arr.length;i++)
{
document.getElementById("result").value += arr[i] + "\n";
}
}
</script>
-过客- 2009-09-18
  • 打赏
  • 举报
回复
其实很简单,就是一个顺序环视和贪婪模式的运用

<textarea id="source" rows="10" cols="100"></textarea><br />
<input type="Submit" value="处理" onclick="opt();"><br />
<textarea id="result" rows="10" cols="100"></textarea><br />
<script type="text/javascript">
function opt()
{
var str = document.getElementById("source").value;
var reg = /<table(?:(?!width=|>)[\s\S])*>/ig;
var arr = str.match(reg);
if(arr != null)
{
for(var i=0;i<arr.length;i++)
{
document.getElementById("result").value += arr[i] + "\n";
}
}
}
</script>
toury 2009-09-18
  • 打赏
  • 举报
回复
改一下

<script>
var str='<table border="0" cellspacing="0" cellpadding="0" width="200">'
+'<table border="0" cellspacing="0" width="200" cellpadding="0" >'
+'<table border="0" cellspacing="0" cellpadding="0" >'
+'<table border="0" cellspacing="0" cellpadding="0" style="width :100px">'
var re=/<table([^w]|(width\s*?:))*?>/ig;
alert(str.match(re));
</script>
toury 2009-09-18
  • 打赏
  • 举报
回复
/<table[^w]*?>/gi
浪尖赏花 2009-09-18
  • 打赏
  • 举报
回复
修改一下:
var rex=/<table((\s)*\b[^w][a-z0-9_]*=[^ >]*)*\s*>/ig;
浪尖赏花 2009-09-18
  • 打赏
  • 举报
回复
table以w开头的属性就一个,只要判断属性是否以w开头就OK了

var str='<table border="0" cellspacing="0" cellpadding="0" width="200">'
+'<table border="0" cellspacing="0" width="200" cellpadding="0" > '
+'<table border="0" cellspacing="0" cellpadding="0" > '
+'<table border="0" cellspacing="0" cellpadding="0" > '
var rex=/<table((\s)*\b[^=w]*=[^ >]*)*\s*>/ig;
alert(str.match(rex));


LZ用的负向预查,负向预查本身是不获取匹配结果的,所以这里无法使用
anjing5566 2009-09-18
  • 打赏
  • 举报
回复
如果要匹配包含width的Table似乎可以这样
<table[^<>]*?width[^<>]*?>
但现在我要匹配不包含width,我第一想到的就是
<table[^<>]*?(?!width)[^<>]*?>

但结果连含width的table也匹配了
anjing5566 2009-09-18
  • 打赏
  • 举报
回复
我可能表述错了一起,我需要匹配的是不包含width的table。

logon29 2009-09-18
  • 打赏
  • 举报
回复
<table[\\w =\\d\"]+(width){1}[=\\d\"]
BeenZ 2009-09-18
  • 打赏
  • 举报
回复
原理没什么好说的吧,就是正则的运用.属性img是全局匹配,大小写不分匹配,多行匹配
BeenZ 2009-09-18
  • 打赏
  • 举报
回复

<html>
<head>
<script language="javascript">
window.onload=function(){
var str=document.body.innerHTML;
var a;
var rex=/(<table\s.*?\s?)width\s*=\s*['|"]?[^\s'"]+(.*?>)/igm;
alert( str.match(rex))

}
</script>
</head>
<body >
<table border="0" cellspacing="0" cellpadding="0" width="200">

<table border="0" cellspacing="0" cellpadding="0" >

</body>
</html>
anjing5566 2009-09-18
  • 打赏
  • 举报
回复
200分,没有人要啊?
anjing5566 2009-09-18
  • 打赏
  • 举报
回复
在线等,解决就结贴

10,612

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 其他
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧