我要求这样的一个表达式:
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>
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>
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>
<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]的时候内部已包含"[",就跳过了。‘
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
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内符合正则表达式的所有子串替换掉。
而且要考虑效率问题,因为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>")
^\[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]"的部分开始解,如果从最外层开始解,后者就会出错。
大家都知道数学运算表达式的()一定要从最内层开始解,不能从最外层开始解,否则顺序可能会错。例如"[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
2."[/abc]"结尾 [/abc]$
3.中间不包含"[abc]" [^abc]\D
4.中间不包含"[/abc]" [^/abc]\D
#13
我的意思一个正则表达式同时符合以上4个要求。
可惜正则表达是不能用AND串起来,否则用你的就可以了……
可惜正则表达是不能用AND串起来,否则用你的就可以了……
#14
你中间插3个.+不就得了?
这样:
[abc]^.+[^abc]\D.+[^/abc]\D.+[/abc]$
不过按说直接连起来用应该也可以
这样:
[abc]^.+[^abc]\D.+[^/abc]\D.+[/abc]$
不过按说直接连起来用应该也可以
#15
[^abc]并不是排除"[abc]"也不是排除"abc"而是排除("a" or "b" or "c")。
[^]好像只是排除单个字符的标记,不能用来排除一个串。
如何才能排除"[abc]"?注意"["和"]"是要排除的部分,不是正则运算的符号。
[^]好像只是排除单个字符的标记,不能用来排除一个串。
如何才能排除"[abc]"?注意"["和"]"是要排除的部分,不是正则运算的符号。
#1
<script language=JavaScript>
a="[a]xx[/a]"
alert(a.match(/^(\[a])[a-zA-Z]+(\[\/a])$/).toString().split(",")[0])
</script>
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>
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>
<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]的时候内部已包含"[",就跳过了。‘
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
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内符合正则表达式的所有子串替换掉。
而且要考虑效率问题,因为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>")
^\[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]"的部分开始解,如果从最外层开始解,后者就会出错。
大家都知道数学运算表达式的()一定要从最内层开始解,不能从最外层开始解,否则顺序可能会错。例如"[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
2."[/abc]"结尾 [/abc]$
3.中间不包含"[abc]" [^abc]\D
4.中间不包含"[/abc]" [^/abc]\D
#13
我的意思一个正则表达式同时符合以上4个要求。
可惜正则表达是不能用AND串起来,否则用你的就可以了……
可惜正则表达是不能用AND串起来,否则用你的就可以了……
#14
你中间插3个.+不就得了?
这样:
[abc]^.+[^abc]\D.+[^/abc]\D.+[/abc]$
不过按说直接连起来用应该也可以
这样:
[abc]^.+[^abc]\D.+[^/abc]\D.+[/abc]$
不过按说直接连起来用应该也可以
#15
[^abc]并不是排除"[abc]"也不是排除"abc"而是排除("a" or "b" or "c")。
[^]好像只是排除单个字符的标记,不能用来排除一个串。
如何才能排除"[abc]"?注意"["和"]"是要排除的部分,不是正则运算的符号。
[^]好像只是排除单个字符的标记,不能用来排除一个串。
如何才能排除"[abc]"?注意"["和"]"是要排除的部分,不是正则运算的符号。