此例子源于csdn网友在讨论区的一个问题。此问题的大概意思就是有一个字符串,由三部分组成:
z=z1 + z2 + z3
让大家写一个代码将 z2 从 z 中取出来。
生成z的代码如下:
Randomize
x1
=
int
(
rnd
()
*
9
)
+
1
Randomize
x2
=
(
int
(
rnd
()
*
9
)
+
1
)
*
2
-
1
Randomize
x3
=
int
(
rnd
()
*
9
)
+
1
for
i
=
1
to
x1
Randomize
y1
=
int
(
rnd
()
*
99999
)
+
1
z1
=
z1
&
"
[
"
&
y1
&
"
]
"
next
for
i
=
1
to
x2
Randomize
y2
=
int
(
rnd
()
*
99999
)
+
1
if
i
mod
2
=
0
then
z2
=
z2
&
"
[
"
&
y2
&
"
]
"
else
z2
=
z2
&
y2
end
if
next
for
i
=
1
to
x3
Randomize
y3
=
int
(
rnd
()
*
99999
)
+
1
z3
=
z3
&
"
[
"
&
y3
&
"
]
"
next
z
=
z1
&
z2
&
z3
此代码生成的字符串的规则如下:
z1 和 z3 是由 1到n 个 格式为 [??]的串组成
z2 是类似 ???[???]??? 格式的字符串 ,其中 [???]部分的个数 比 ???部分个数 少一个,并且是这样交叉的形式 :一个???? 一个 [???] 。??部分至少一个。他们格式如下:
z1=n个[??] (n>=1) '
z3=n个[??] (n>=1)z2=那个 QM (n>=1)
Q=n个 ??[??] (1>=n>=0)
M=1个 ??
解决代码:
一,不用正则:
function trim_ns(strSource)
str =
strSource
do
while
(str
<>
""
)
pos1 =
instr
(str,
"
]
"
)
if
(pos1
>
0
)
then
str =
mid
(str,pos1
+
1
)
if
left
(str,
1
)
<>
"
[
"
then
exit
do
end
if
loop
do
while
(str
<>
""
)
pos1 =
instrRev
(str,
"
[
"
)
if
(pos1
>
0
)
then
str =
left
(str,pos1
-
1
)
if
right
(str,
1
)
<>
"
]
"
then
exit
do
end
if
loop
trim_ns =
str
end function
response.Write trim_ns(z)
二,用正则:
function trim_ns(strSource)
dim re
set re
=
new
RegExp
re.Global = true
re.IgnoreCase = true
re.MultiLine = false
re.Pattern = "
.*?](([^[].*][^[].*?)|([^[].*?))[.*
"
trim_rs = re.Replace(strSource,
"
$1
"
)
set re
=
nothing
end function
response.write trim_ns(z)
这个问题其实很简单,之所以发出来,是因为开始的时候我写了3个正则都失败了。最后放弃了,然后用字符串处理的常规方法解决的。但是另一个网友用正则解决的。我一阅读发现。自己的正则水平实在是太差了,这么简单的正则式都没有写对。惭愧!