正则表达式问题-如何排除一个字符串?

时间:2023-01-07 10:31:08
用[^]好像只能排除一个字符,如何排除一个字符串?

我要求这样的一个表达式:
1."[abc]"开头
2."[/abc]"结尾
3.中间不包含"[abc]"
4.中间不包含"[/abc]"
要求同时满足以上4条要求的正则表达式怎么写?

15 个解决方案

#1


<script language=JavaScript>
a="[a]xx[/a]"
alert(a.match(/^(\[a])[a-zA-Z]+(\[\/a])$/).toString().split(",")[0])
</script>

#2


<script language=JavaScript>
a="[a]xx[/a]"
b="[a]x[a]x[/a]"
c="[a]x[/a]x[/a]"
try{alert(a.match(/^(\[a])[a-zA-Z]+(\[\/a])$/).toString().split(",")[0])}catch(e){alert("error input!")}
try{alert(b.match(/^(\[a])[a-zA-Z]+(\[\/a])$/).toString().split(",")[0])}catch(e){alert("error input!")}
try{alert(c.match(/^(\[a])[a-zA-Z]+(\[\/a])$/).toString().split(",")[0])}catch(e){alert("error input!")}
</script>

#3


查找是否存在:不存在返回-1,否则返回0
<script language=JavaScript>
a="[aa]xx[/aa]"
b="[aa]x[aa]x[/aa]"
c="[aa]x[/aa]x[/aa]"
try{alert(a.search(/^(\[aa])[a-zA-Z]+(\[\/aa])$/))}catch(e){alert("error input!")}
try{alert(b.search(/^(\[aa])[a-zA-Z]+(\[\/aa])$/))}catch(e){alert("error input!")}
try{alert(c.search(/^(\[aa])[a-zA-Z]+(\[\/aa])$/))}catch(e){alert("error input!")}
</script>

#4


一下是dvbbs中把ubbcode的 转换成<b></b>的语句:
re.Pattern="\[b\](.[^\[]*)(\[\/b\])"
strContent=re.Replace(strContent,"<b>$1</b>")
我要的就是这个用途。但大家可以看到它是排除"["的,也就是说对于同时处理 标记的两个语句:
re.Pattern="\[i\](.[^\[]*)\[\/i\]"
strContent=re.Replace(strContent,"<i>$1</i>")
re.Pattern="\[b\](.[^\[]*)(\[\/b\])"
strContent=re.Replace(strContent,"<b>$1</b>")
如果是这样:"[b][i]
",因为先把 处理,成为"<i></i>",在处理,返回是正确的。但如果是这样:"[i][b]",则返回" <b></b>"。因为先处理[i]的时候内部已包含"[",就跳过了。‘

#5


up

#6


这么容易的问题还不如不用正则了!
1."[abc]"开头
2."[/abc]"结尾
3.中间不包含"[abc]"
4.中间不包含"[/abc]"
if mid(s,1,5) = "[abc]" Then
   if right(s,6) ="[/abc]" Then
     if len(s)=len(replace(s,"[abc]","")+5) Then
        if len(s)=len(replace(s,"[/abc]","")+6) Then
              

#7


这个当然最好还是用回原来正则来解决,因为dvbbs的整个ubbcode都是这样处理的。
而且要考虑效率问题,因为dvbbs这样的东西贴子现实肯定不做缓存的,每次张贴子的浏览都要一次decode,都可能要调用非常多次这样的检查。如果用正则,效率和若干次If和For的嵌套相比,哪个更高?
而且可能是你理解错了,我的目的不是要检查一个string是否符合正则表达式,而是把string内符合正则表达式的所有子串替换掉。

#8


没有人知道吗?

#9


the regex in vbscript is not very powerful, it cannot do something like

^\[abc\](?!.*?\[abc\]).*(?<!\[/abc\].*?)\[/abc\]$

as in .NET

if you want to make
.. to <b>..</b>, why cannot you replace all "[...]" with "<...>"?

set re = new RegExp
s = "[abc]..[/abc]"
re.Pattern = "\[([^]]+)\]"
re.Global=true
Msgbox re.Replace(s,"<$1>")

#10


我的关键是"[abc]..[/abc]"中间的部分不能包含"[abc]"且不能包含"[/abc]"。
大家都知道数学运算表达式的()一定要从最内层开始解,不能从最外层开始解,否则顺序可能会错。例如"[abc]x[abc]y[/abc]z[/abc]"和"[abc]x[/abc]y[abc]z[/abc]"的区别,一定要从最内层——就是不再包含"[abc]"或"[/abc]"的部分开始解,如果从最外层开始解,后者就会出错。

#11


我半年没成功提前着这贴了,现在提前怎么还说“太频繁”?

#12


1."[abc]"开头 [abc]^
2."[/abc]"结尾 [/abc]$
3.中间不包含"[abc]" [^abc]\D
4.中间不包含"[/abc]" [^/abc]\D

#13


我的意思一个正则表达式同时符合以上4个要求。
可惜正则表达是不能用AND串起来,否则用你的就可以了……

#14


你中间插3个.+不就得了?
这样:
[abc]^.+[^abc]\D.+[^/abc]\D.+[/abc]$
不过按说直接连起来用应该也可以

#15


[^abc]并不是排除"[abc]"也不是排除"abc"而是排除("a" or "b" or "c")。
[^]好像只是排除单个字符的标记,不能用来排除一个串。

如何才能排除"[abc]"?注意"["和"]"是要排除的部分,不是正则运算的符号。

#1


<script language=JavaScript>
a="[a]xx[/a]"
alert(a.match(/^(\[a])[a-zA-Z]+(\[\/a])$/).toString().split(",")[0])
</script>

#2


<script language=JavaScript>
a="[a]xx[/a]"
b="[a]x[a]x[/a]"
c="[a]x[/a]x[/a]"
try{alert(a.match(/^(\[a])[a-zA-Z]+(\[\/a])$/).toString().split(",")[0])}catch(e){alert("error input!")}
try{alert(b.match(/^(\[a])[a-zA-Z]+(\[\/a])$/).toString().split(",")[0])}catch(e){alert("error input!")}
try{alert(c.match(/^(\[a])[a-zA-Z]+(\[\/a])$/).toString().split(",")[0])}catch(e){alert("error input!")}
</script>

#3


查找是否存在:不存在返回-1,否则返回0
<script language=JavaScript>
a="[aa]xx[/aa]"
b="[aa]x[aa]x[/aa]"
c="[aa]x[/aa]x[/aa]"
try{alert(a.search(/^(\[aa])[a-zA-Z]+(\[\/aa])$/))}catch(e){alert("error input!")}
try{alert(b.search(/^(\[aa])[a-zA-Z]+(\[\/aa])$/))}catch(e){alert("error input!")}
try{alert(c.search(/^(\[aa])[a-zA-Z]+(\[\/aa])$/))}catch(e){alert("error input!")}
</script>

#4


一下是dvbbs中把ubbcode的 转换成<b></b>的语句:
re.Pattern="\[b\](.[^\[]*)(\[\/b\])"
strContent=re.Replace(strContent,"<b>$1</b>")
我要的就是这个用途。但大家可以看到它是排除"["的,也就是说对于同时处理 标记的两个语句:
re.Pattern="\[i\](.[^\[]*)\[\/i\]"
strContent=re.Replace(strContent,"<i>$1</i>")
re.Pattern="\[b\](.[^\[]*)(\[\/b\])"
strContent=re.Replace(strContent,"<b>$1</b>")
如果是这样:"[b][i]
",因为先把 处理,成为"<i></i>",在处理,返回是正确的。但如果是这样:"[i][b]",则返回" <b></b>"。因为先处理[i]的时候内部已包含"[",就跳过了。‘

#5


up

#6


这么容易的问题还不如不用正则了!
1."[abc]"开头
2."[/abc]"结尾
3.中间不包含"[abc]"
4.中间不包含"[/abc]"
if mid(s,1,5) = "[abc]" Then
   if right(s,6) ="[/abc]" Then
     if len(s)=len(replace(s,"[abc]","")+5) Then
        if len(s)=len(replace(s,"[/abc]","")+6) Then
              

#7


这个当然最好还是用回原来正则来解决,因为dvbbs的整个ubbcode都是这样处理的。
而且要考虑效率问题,因为dvbbs这样的东西贴子现实肯定不做缓存的,每次张贴子的浏览都要一次decode,都可能要调用非常多次这样的检查。如果用正则,效率和若干次If和For的嵌套相比,哪个更高?
而且可能是你理解错了,我的目的不是要检查一个string是否符合正则表达式,而是把string内符合正则表达式的所有子串替换掉。

#8


没有人知道吗?

#9


the regex in vbscript is not very powerful, it cannot do something like

^\[abc\](?!.*?\[abc\]).*(?<!\[/abc\].*?)\[/abc\]$

as in .NET

if you want to make
.. to <b>..</b>, why cannot you replace all "[...]" with "<...>"?

set re = new RegExp
s = "[abc]..[/abc]"
re.Pattern = "\[([^]]+)\]"
re.Global=true
Msgbox re.Replace(s,"<$1>")

#10


我的关键是"[abc]..[/abc]"中间的部分不能包含"[abc]"且不能包含"[/abc]"。
大家都知道数学运算表达式的()一定要从最内层开始解,不能从最外层开始解,否则顺序可能会错。例如"[abc]x[abc]y[/abc]z[/abc]"和"[abc]x[/abc]y[abc]z[/abc]"的区别,一定要从最内层——就是不再包含"[abc]"或"[/abc]"的部分开始解,如果从最外层开始解,后者就会出错。

#11


我半年没成功提前着这贴了,现在提前怎么还说“太频繁”?

#12


1."[abc]"开头 [abc]^
2."[/abc]"结尾 [/abc]$
3.中间不包含"[abc]" [^abc]\D
4.中间不包含"[/abc]" [^/abc]\D

#13


我的意思一个正则表达式同时符合以上4个要求。
可惜正则表达是不能用AND串起来,否则用你的就可以了……

#14


你中间插3个.+不就得了?
这样:
[abc]^.+[^abc]\D.+[^/abc]\D.+[/abc]$
不过按说直接连起来用应该也可以

#15


[^abc]并不是排除"[abc]"也不是排除"abc"而是排除("a" or "b" or "c")。
[^]好像只是排除单个字符的标记,不能用来排除一个串。

如何才能排除"[abc]"?注意"["和"]"是要排除的部分,不是正则运算的符号。