正则表达式中如何排除一个字符串

ylhyh 2008-07-18 06:05:19
用[^]只能排除一个字符,如何排除一个字符串?
下面这样一个正则式:
/<COLUMNS><FLDNAME>\w+<\/FLDNAME>=<FLDVALUE>值域<\/FLDVALUE><\/COLUMNS>/g

有一字符串有N个像上面这样的式子组成,我希望在值域中不会匹配到下面的任何一个串:
<COLUMNS>
</COLUMNS>
<FLDNAME>
</FLDNAME>
<FLDVALUE>
</FLDVALUE>

请问值域位置的表达式怎样写?

类似于这个问题:http://topic.csdn.net/t/20030411/20/1649861.html
...全文
1383 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
HZYC888 2010-02-21
  • 打赏
  • 举报
回复
有参考价值!
BINGO!
bhtfg538 2008-07-18
  • 打赏
  • 举报
回复
LZ
回来看了xia


原来你要 中间的内容啊
<FLDNAME>DXCS </FLDNAME>= <FLDVALUE>1 </FLDVALUE>


看来 我画蛇添足了

直接用非贪婪匹配
举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。

举例2:相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。
bhtfg538 2008-07-18
  • 打赏
  • 举报
回复
LZ
FLDNAME不是也要匹配吗?
ylhyh 2008-07-18
  • 打赏
  • 举报
回复
受教了,原来就样就是非贪婪匹配,难怪之前用.*去匹配是错的
感谢各位
老紫竹 2008-07-18
  • 打赏
  • 举报
回复
.*是贪婪匹配,会匹配最多的字符
.*?是非贪婪匹配,会匹配最少的字符
ylhyh 2008-07-18
  • 打赏
  • 举报
回复
或是这么写:
var columns=result.match(/\<COLUMNS\>\<FLDNAME\>\w+\<\/FLDNAME\>=\<FLDVALUE\>.*?\<\/FLDVALUE\>\<\/COLUMNS\>/g);

尖括号是具体字符(没有空格)
ylhyh 2008-07-18
  • 打赏
  • 举报
回复
mingxuan3000,谢谢你
目前看来问题是解决的,但不知为什么解决了

我是这样写的式子
var columns=result.match(/<COLUMNS><FLDNAME>\w+<\/FLDNAME>=<FLDVALUE>.*?<\/FLDVALUE><\/COLUMNS>/g);

你能解释一下.*?吗?
在我认为加不加?是一样的,但不加?的测试结果却是错的,不明白
mingxuan3000 2008-07-18
  • 打赏
  • 举报
回复

<script language="JavaScript" type="text/javascript">
var sToMatch = "<COLUMNS> <FLDNAME>GCLX </FLDNAME>= <FLDVALUE>A </FLDVALUE> </COLUMNS><COLUMNS> <FLDNAME>GCDH </FLDNAME>= <FLDVALUE>I0102-000069-001 </FLDVALUE> </COLUMNS> "
alert(sToMatch.match(/<COLUMNS>.*?<\/COLUMNS>/g))
alert(sToMatch.match(/<COLUMNS>.*?<\/COLUMNS>/g)[0])
alert(sToMatch.match(/<COLUMNS>.*?<\/COLUMNS>/g)[1])
</script>


这样?
bhtfg538 2008-07-18
  • 打赏
  • 举报
回复
js
很麻烦些
因为不支持 (?<!xxxxx)反向预搜索
?!
(?<!columns>)(\w+)(?!<columns>)....
你那 写是写的出要麻烦的多哈
可以去一个一个去判断
复杂多了 ~
可惜js 不支持反向搜索
ylhyh 2008-07-18
  • 打赏
  • 举报
回复
没有空格的,被CSDN自动加了空格
ylhyh 2008-07-18
  • 打赏
  • 举报
回复
谢谢bhtfg538了,还不行
这么说吧,我下面一个串(没有换行的,换行是为了看着直观):
'<COLUMNS><FLDNAME>GCLX</FLDNAME>=<FLDVALUE>A</FLDVALUE></COLUMNS>
<COLUMNS><FLDNAME>GCDH</FLDNAME>=<FLDVALUE>I0102-000069-001</FLDVALUE></COLUMNS>
<COLUMNS><FLDNAME>GCMC</FLDNAME>=<FLDVALUE>电缆厂7#职工住宅楼</FLDVALUE></COLUMNS>
<COLUMNS><FLDNAME>SGDW</FLDNAME>=<FLDVALUE>建筑工程处</FLDVALUE></COLUMNS>
<COLUMNS><FLDNAME>KGSJ</FLDNAME>=<FLDVALUE>2000-4-1 0:00:00</FLDVALUE></COLUMNS>
<COLUMNS><FLDNAME>JGSJ</FLDNAME>=<FLDVALUE>2001-6-20 0:00:00</FLDVALUE></COLUMNS>
<COLUMNS><FLDNAME>JZMJ</FLDNAME>=<FLDVALUE>3024.00</FLDVALUE></COLUMNS>
<COLUMNS><FLDNAME>JGLX</FLDNAME>=<FLDVALUE>砖混</FLDVALUE></COLUMNS>
<COLUMNS><FLDNAME>DXCS</FLDNAME>=<FLDVALUE>1</FLDVALUE></COLUMNS>'

变量result中存储着这个串值,我想通过match函数取回一个由上面的每一行组成的数组:
var columns=result.match(表达式);
这个表达式该怎么写?

bhtfg538 2008-07-18
  • 打赏
  • 举报
回复
貌似有点错误 要下班了 ~
bhtfg538 2008-07-18
  • 打赏
  • 举报
回复
举例3:表达式 "((?!\bstop\b).)+" 在匹配 "fdjka ljfdl stop fjdsla fdj" 时,将从头一直匹配到 "stop" 之前的位置,如果字符串中没有 "stop",则匹配整个字符串。

举例4:表达式 "do(?!\w)" 在匹配字符串 "done, do, dog" 时,只能匹配 "do"。在本条举例中,"do" 后边使用 "(?!\w)" 和使用 "\b" 效果是一样的。


var a=(?!\<columns\>)(\w+)(=(?!\<\/columns\>))其他类似
ylhyh 2008-07-18
  • 打赏
  • 举报
回复
(?! )
零宽度负预测先行断言。仅当子表达式不在此位置的右侧匹配时才继续匹配。例如,\b(?!un)\w+\b 与不以 un 开头的单词匹配。


这个解释我真是搞不明白
ylhyh 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 bhtfg538 的回复:]
那就用(?! <COLUMNS>)
里面就是一个字符串哈 呵呵~
[/Quote]

bhtfg538,请具体说说?!的用法

这么写吗:
var columns=result.match(/<COLUMNS><FLDNAME>\w+<\/FLDNAME>=<FLDVALUE>(?!<COLUMNS>)(?!<\/COLUMNS>)(?!<FLDNAME>)(?!<\/FLDNAME>)(?!<FLDVALUE>)(?!<\/FLDVALUE>)<\/FLDVALUE><\/COLUMNS>/g);
bhtfg538 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yifanwu 的回复:]
不是括号,是中括号,楼上的打星际?上VS么,我21级,好久来打两盘?
[/Quote]

你都lv21 了 估计可以打赢 NaDa Boxer yellow Ipx Reach Flash July FrogGG BackHo。。。
打扁他们韩国星际高手们
呵呵~
把Flash 教主日了
还有Jaedong
bhtfg538 2008-07-18
  • 打赏
  • 举报
回复
那就用(?!<COLUMNS>)
里面就是一个字符串哈 呵呵~
ylhyh 2008-07-18
  • 打赏
  • 举报
回复
用<COLUMNS>打个比方说:
我是要排除:"<COLUMNS>" 但并不排除'C',也就是说不排除<COLUMNS>包括的单个字符,只有出现完整的<COLUMNS>时才排除

bhtfg538 2008-07-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yifanwu 的回复:]
不是括号,是中括号,楼上的打星际?上VS么,我21级,好久来打两盘?
[/Quote]

呵呵 vs 玩啊?
现在玩的少了
忙着开发了 ~我是菜
lv21 基本无敌了
你当我师傅把
我 lv11
很久没有玩了 号都给别人了
最近在玩马甲
lv5了
嘿嘿
bhtfg538 2008-07-18
  • 打赏
  • 举报
回复
不匹配也可以用
?!
LZ修改下


加载更多回复(2)

87,917

社区成员

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

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