找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1768|回复: 16

[讨论]:写一个支持通配符的文字替换程序,请大侠出手

[复制链接]
发表于 2005-10-23 17:49:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
写一个支持通配符的文字替换程序,请列位大侠出手
假设程序为fun,所要的效果:
(fun "*AA*Y*" "*bc*c*" "11bc22bc") -> "11AA22bY"
(fun "*AA?Y*" "*bc?c*" "11bc2c2bc") -> "11AA2Y2bc"
(fun "*写程序?Y*" "*bc?c2b*" "11bc2c2bc") -> "11写程序2Yc"
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-10-23 21:19:36 | 显示全部楼层
用 vlisp 调用 c 的正则替换函数应该可以实现
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-23 22:04:36 | 显示全部楼层
我的基本思维

1。对于*类
比如对于*bc*c*  11bc3c5
首先WCMATCH看看两个是否可以对等,可以再继续
然后利用vl-string-translate将*变成空格,再变成表
即 (bc c)--lista
然后对11bc3c5进行查找,比如先查找lista中的bc
get position,取出11,赋值给listb,
将减去bc及前面一截的字符串3c5附给string1,
然后继续搜索表,循环到结束
得到表listc(11 3 5)
然后对于要修改的*AA*B*
也变成一个表listd,listd与listc合并就得到结果,这个只是针对*而言的

大概如下
(setq stringa "*AA*B*" stringb "*bc*c*" stringc "11bc3c5")
(wcmatch stringb stringc) T才继续
(setq listb (v-s-l stringb)) 假设v-s-l就是那个把有*号的字符变成表
此时listb=(bc c)
(setq i 0 stringd stringc)
(while not (end of listb)
(setq stringe (vl-find stringd (nth i listb)));其中vl-find是找到bc所在位置
(append stringe listc)
(setq stringd (cut-off stringd));cutoff是将前面找到的砍掉
(setq i (1+ i))
)
最后要得到(listc= 11 3 5)
然后
(setq lista (v-s-l stringa))
那么lista就是(AA B)
依次合并lista和listc,就可以得到新表(11 AA 3 B 5)
再将其变为字符串即可

对于?这个适配符,我感觉好像有点奇怪,似乎在这里可以用*将就代替
因为?可能会导致WCMATCH的时候出问题
可能我的思路一直有点走弯路吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-24 00:03:51 | 显示全部楼层
我觉得你说的很好,大家继续....:P
2楼能介绍一下 "正则替换函数"么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-24 00:32:00 | 显示全部楼层
对的用WCMATCH非常好
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-24 18:35:12 | 显示全部楼层
睡了一觉,今天的想法变成这样,不过还没有想清楚
可以利用(vl-string->list  string)
把所有的字符拆散,包括(fun A B C)中的A B C
对于“*”这个asc字符,利用一定的判别原则(B)把(A)和(C)结合起来应该就可以的
这时候用(vl-list-string)
说不定会快些
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-24 19:43:52 | 显示全部楼层
连狂刀都没搞定呢,幸好我用tssd,查找替换功能非常棒,支持通配符,支持标注文字,可搜索整个字符串或部分字符串
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-24 19:43:58 | 显示全部楼层
有没有人写好了程序,上传一下呀
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-24 19:48:02 | 显示全部楼层
拓展一下,应当讨论如何全部或者部分的实现正则表达式功能.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 208个

财富等级: 日进斗金

发表于 2005-10-24 19:57:42 | 显示全部楼层
cad本身快速选择可以支持通配符替换!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-24 21:50:55 | 显示全部楼层
我不清楚狂刀兄这个函数会不会比较频繁的运用,因为这个函数好像对于普通的
查找替换来说有点复杂了.
lisp应该可以处理正则表达式,但是可能没有vb,c等这些高级语言来的方便
比如http://aec.cadalyst.com/aec/article/articleDetail.jsp?id=128440
这里提到了vb和正则表达式
http://support.microsoft.com/default.aspx?scid=kb;en-us;818802
这里提到了"How To Use Regular Expressions in Microsoft Visual Basic 6.0."
而各种ultraedit之类的正则功能也非常高级,当然,要是象二楼兄弟提到的可以运用如C语言之类的正则表达式就更好了.
http://autolisp.mapcar.net/pcre.html

这里提到了正则表达式,不过他必须引用一个arx
http://www.cadforum.cz/cadforum_en/default.asp?tab=4这里的srxTEXT挺好
http://www.iproject.cz/get.asp?/ ... /System/SRXTEXT.ZIP
是个挺厉害的支持正则表达式的文本代替程序,可惜是vlx的,还必须引用et工具的acet函数
它可以完成类似如下的操作
Using regular expressions you can perform complex
replacements like changing:
D19-457-03667
to
Part:457/03667 Code:D19
For this case you would use the search and replace
strings:
\([A-Z][0-9][0-9]\)\-\(...\)\-\(.*\)
Part:\2/\3 Code:\1
不过这些和狂刀兄的函数都有点出入,也看不到人家的源码,只能再想想办法的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-10-24 22:51:40 | 显示全部楼层
Emacs 正则表达式简介(From 水木清华)
发信人: dddkk (进化的鱼), 信区: Emacs
标 题: Emacs 的正则表达式
发信站: BBS 水木清华站 (Thu Mar 18 20:11:52 2004), 转信

两年多以前翻译的,就是 (info "(emacs)Regexps") 一节。

正则表达式语法
正则表达式(regular expressions, 缩写为regexp)是由几个特殊字符和一些普通字符组成,一个普通就是一个简单的正则表达式,仅仅可以匹配与自己相同的字符。而特殊字符包括“$”,“^”, “.”, “*”, “+”, “?”,“[”, “]” 以及 “\”。除非在一个字符前面有“\”,否则正则表达式中的出现的任何其他字符都是普通字符,(当你在 Lisp 语言的程序中使用正则表达式的时候,每一个“\”都必须写成两个,请看下面的例子。)

例如,“f”不是特殊字符,是普通字符,因此“f”是一个正则表达式,它仅仅匹配“f”这个字符串。(不匹配串“ff”。)同样“o”是一个仅仅匹配串“o”的正则表达式。(当不区分大小写的时候,上面提到的式子也匹配“F”和“O”,而一般认为它们是“同样的串”,并不是例外。)

两个任意的表达式 A 和 B 可以被连接。结果是一个能够匹配以 A 开始,其余部分是 B 的字符串的表达式。

举个简单的例子,我们将表达式“f”和“o”连接,得到表达式“fo”,它仅匹配串“fo”,很简单的。想做些不简单的,你需要使用特殊字符。下面为这些特殊字符。

特殊字符
“. (Period)”
一个匹配除了换行符(newline)之外任何单个字符的特殊字符。使用连接,我们 可以得到如“a.b”的表达式,它匹配了所有的以“a”开始,以“b”结束的三 个字符的字符串。

“*”
自身不构成表达式的部分;它是个后缀操作符,表示某个前导表达式重复任意次。 比如,“o*”匹配任意个数的“o”(包括没有“o”)。

“*”总是作用于“最少的”可能的前导表达式。于是,“fo*”中,认为“o”是 的重复,而不是“fo”,匹配形如“f”, “fo”, “foo”的串等等。

匹配程序以迅速的、尽可能多的找到重复部分来处理一个带“*”的结构。然后继 续其他部分的处理。如果失败了,为了使剩余的部分能够尽可能的匹配,匹配程 序会回退,放弃一些由“*”匹配的结构。例如,在使用“ca*ar”来匹配串 “caaar”时,“a*”首先试图匹配全部的三个“a”;但余下的部分是“ar”并 且仅有“r”没被匹配,因此这次试图匹配失败。接着选择是用“a*”来匹配两个 “a”,并且匹配成功。

“+”
是一个和“*”相似的后缀操作符,它匹配前导表达式至少一次的出现。例如, “ca+r”匹配串“car”和“caaaar”,不匹配“cr”,然而“ca*r”可以匹配这 三个串。

“?”
也是一个和“*”相似的操作符,它匹配前导表达式至多一次的出现。例如, “ca?r”仅仅匹配“car”或“cr”。

“*?, +?, ??”
是前面几个个操作符的非贪心(non-greedy)的变体。正常的“*”, “+”, “?” 操作符是“贪心的(greedy)”,只要总体上能够匹配,这些操作符总是尽可能多 的匹配。当有一个紧跟着的“?”,就是是非贪心的了:将尽可能少的匹配。

“ab*”和“ab*?”都能匹配串“a”和“abbbb”;但如果你试图用它们来匹配 “abbb”时,“ab*”将匹配全部(最长有效匹配),而“ab*?”将仅仅匹配“a” (最短有效匹配)。

“\{N\}”
指定重复次数为 N 的后缀操作符,一个前导表达式必须恰好匹配了 N 次。例如 “x\{4\}”仅仅匹配串“xxxx”。

“\{N,M\}”
指定重复次数在N和M之间的后缀操作符,就是说它的前导表达式的匹配次数至少 N 次但不能超过 M 次。如果省略 M,表示没有上限,但它的前导表达式至少匹配 N 次。“\{0,1\}”等同于“?”。“\{0,\}”等同于“*”。“\{1,\}”等同于 “+”。

“[ ... ]”
字符集,以“[”开始以“]”结束。最简单的例子,在两个方括号中间的字符就 是这个集合所能匹配的全部。

所以,“[ad]”仅匹配一个“a”或一个“d”,“[ad]*”匹配所有仅由“a”和 “d”构成的串(包括空串)。“c[ad]*r”匹配“cr”,“car”, “cdr”, “caddaar”,等等。

也可以用一个“-”放在一个开始字符和一个结束字符的中间来在字符集中包含这 个范围。“[a-z]”匹配所有小写 ASCII 字母。范围可以和单独的字符自由的组 合在一起,比如“[a-z$%.]”,匹配了任意的小写字母,或“$”,“%”,以及 “.”。

注意,通常在字符集中的特殊字符不再特殊。而在字符集中的“]”,“-”和 “^”却不这样。

如果想在集中包括“]”,必须把它作为字符集中的第一个字符。例如,“[]a]” 匹配“]”或“a”。想包括“-”,它要是字符集中的第一个或最后一个字符。 或者放在一个范围的后面。如“[]-]”匹配“]”和“-”。

如果想在集包括字符“^”,它可以在除第一个位置以外的任何地方。(在开始 位置,它会把这个字符集取补——看下面。)

当不区分大小写使用范围时,表示范围的两个字符或者都是大写、或者都是小写、 或者都不是字母。混合大小写的范围如“A-z”有点错误定义的意思,在将来的 Emacs 中这个可能会被改变。

“[^ ... ]”
“[^”表示“补集合”,匹配的字符是除掉指定的字符外其他所有的字符。如, “[^a-z0-9A-Z]”匹配除掉ASCII字母和数字的所有字符。

当“^”在字符集中第一个时,被看作是特殊字符。而跟在“^”后面的字符被看 作是第一个字符(就是说,此处的“-”和“]”将不是特殊的)。

一个补集合可以匹配换行符,除非换行符被指定为补集合中的一个字符。这不同 于某些象“grep”的程序对正则表达式的处理。

“^”
仅仅匹配在文本中行首的那个空串的特殊字符。就是说,“^foo”匹配在行首的 “foo”。

“$”
和“^”相似,但仅匹配行尾的空串。因此“x+$”匹配在行尾的一个或多个“x” 的串。

“\”
有两个作用:引用特殊字符(包括“\”);产生附加的特殊结构。

因为“\”引用特殊字符,“\$”是一个仅匹配“$”的表达式,“\[”是一个仅 匹配“[”的表达式,等等。

关于反斜线
注意:为兼容性考虑,特殊字符,如果在其没有意义的上下文中,将被当作普通字符。比如:“*foo”中把“*”当作普通字符,因为在它前面没有可以作用的前导表达式。很少有人会根据这条规则去实践;无论如何,在任何地方都加上引用会更好些。

对于大多数情况,“\”后接任何字符仅仅匹配那个字符。然而,有几个例外:以“\”开始的两字符序列会有特殊的意思。其中的第二个字符往往是普通字符。下面是“\”的结构表。

“\|”
指定一个选择。中间有一个“\|”的两个正则表达式 A 和 B,形成了一个可以匹 配 A 或 B 的文本。它首先试图用 A 匹配,如果失败再用 B 去试。

由此,“foo\|bar”仅匹配“foo”或“bar”。

“\|”作用于两边最长的可能的表达式。仅由“\( ... \)”括起来才可以限制 “\|”的分组能力。

Emacs 有全面的回退功能,以处理“\|”的多种的用途。

“\( ... \)”
分组结构,有三个功能:

围住“\|”的选择项,以实现别的操作。例如“\(foo\|bar\)x”匹配 “foox”或“barx”。
围住复杂的表达式以实现后缀操作符(如“*”“+”和“?”)的操作。例如 “ba\(na\)*”匹配如“bananana”等,有任意个(零或更多)的“na”串。
记录一个已匹配的子串用作后面的参考引用。
最后一个应用并不是括号的分组功能思想的结果;这个分开的特点是给同样的 “\( ... \)”结构赋予的第二种含义。在实际应用中,这两种含义通常不会发生 冲突。当发生冲突的时候,可以使用“谨慎的”分组("shy" group)。

“\(?: ... \)”
“谨慎的”分组("shy" group),这个分组不记录匹配的子串;你不能用“\D”来 引用。这在机械的结合正则表达式的时候有用,这样,你可以为语法目的加入分 组,而不用干涉使用者写的分组的个数。

“\D”
匹配和“\( ... \)”结构第 D 次出现时所匹配的同样的文本。

在“\( ... \)”结构结束之后,匹配程序保存被这个结构匹配的文本(的开始和 结束);之后的正则表达式中,你可以使用“\”跟着一个数字 D 来表示“匹配 和‘\( ... \)’结构第 D 次出现时所匹配的同样的文本。”

正则表达式中前九个出现的“\( ... \)”结构,按正则表达式中左括号出现的次 序从 1 到 9 赋值。因此可以用“\1”到“\9”来引用相应的“\( ... \)”结构。

例如,“\(.*\)\1”匹配任何有完全相同的两部分而无换行符的串。“\(.*\)” 匹配前一半,可以是任意的串,“\1”匹配后面的,但必须和前面的完全相同。

如果一个特定的“\( ... \)”结构匹配了多次(比如后面有一个“*”,这很显 然),那么仅记录最后一次的匹配。

“\`”
匹配空串,但仅是接在缓冲区的开始处的。

“\'”
匹配空串,但仅是接在缓冲区的尾部的。

“\=”
匹配空串,但仅在“点(point)”处的。

“\b”
匹配空串,但仅在一个词的开始或者结尾的。例如,“\bfoo\b”匹配任何作为单 独的词出现的“foo”。“\bballs?\b”匹配作为单独的词出现的“ball”或 “balls”。

在缓冲区的开始和结束位置时,“\b”不考虑紧接其前的文本是什么。

“\B”
匹配空串,但不在词的开始或结尾处。

“\<”
匹配空串,但仅在词的开始处。仅当一个构成词的字符在缓冲区开始处时“\<” 匹配缓冲区开始处的空串。

“\>”
匹配空串,但仅在词的结尾处。仅当缓冲区尾部有构成词的字符时“\>”匹配缓 冲区尾部的空串。

“\w”
匹配任何构成词的字符。由语法表决定这些字符是什么。

“\W”
匹配任何非构成词的字符。

“\sC”
匹配任何语法是 C 的字符。这里 C 是一个指定特定语法类的字符:如“w”为词 的构成字符,“-”或“ ”为空白,“.”为普通标点符号,等等。

“\SC”
匹配任何字符不属于语法 C。

“\cC”
匹配任何属于种类 C 的字符。例如,“\cc”匹配汉字,“\cg”匹配希腊字符等。 如果想了解已知种类,用“M-x describe-categories ”。

“\CC”
匹配所有不属于种类C的字符。

属于词和语法的结构是由语法表的设置来控制的。


下面是一个复杂的正则表达式,存储在“sentence-end”,Emacs 将其用于识别句子的结束以及后面的任何空白。其中以 Lisp 语法区分了空白符和制表符。在 Lisp 语法中,串常量用双引号括起来。“\"”表示双引号是表达式的一部分, “\\”表示反斜扛是表达式的一部分,“\t”表示制表符,“\n”表示换行。

   "[.?!][]\"')]*\\($\\| $\\|\t\\|  \\)[ \t\n]*"
其中包含四个连续的部分:匹配句号(“.”)、“?”或“!”的字符集;匹配右方括号、右(单/双)引号的字符集的任意次重复的部分;在“反斜线括号”部分中,匹配行尾、行尾空白、制表符或两个空格的可选集合;以及一个任意次匹配空白的字符集。

在增量搜索中,要用 输入制表符,“C-j”输入换行符。也可以使用单独的反斜线,不用象 Lisp 串中那样写成两个。

Author: Wang Chunyu <dddkk@sina.com> Create: "2002-04-20"
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-25 14:20:27 | 显示全部楼层
好像这个正则表达式和lisp的还有点区别,既然用到lisp,就按wcmatch的语法来考虑编程吧

[php]
wcmatch

语法

    (wcmatch string pattern)

功能及参数

    这个函数在所提供的字符串 string 上执行通配符的样式比较。string 会与 pattern 作比较, 看看它们是否相等。如果是, 则返回 T, 否则返回 nil。

   string和pattern 都可以是一个加引号的文数字符串或是一个变量。pattern 可以包含下列的万用样式代替字符。

   string和pattern中大约只有前500个字符会被比较, 超过的部分则将被忽略。以下是可用的通配符意义:

 

字     符
意    义

#

(货币单位)
可代替单一数字

@

(圈a)
可代替任何单一的字母字符



(句点)
可代替任何单一的非文数字符

*

(星号)
可代替任何字符顺序, 包括空字符。它可以使用于搜寻样式的任何地方:开头、中间或结尾

?

(问号)
可代替任何单一字符



(浪纹连接号)
如果它是样式中的第一个字符, 则它会代替到该样式以外的任何东西

[...]
可代替所括起来的任何一个字符

[~...]
可代替不括在里面的任何字符

(连字号)
用于中括号中以表示单一字符的范围

,

(逗号)
分开两个样式

`

(反引号)
可跳过特殊字符 (按照顺序读入下一个字符)


范例

     (wcmatch “Name"”N*")  返回  T

    这个函数将测试字符串Name, 看看它是否是以字符N 作开头。您可以在一个样式中使用逗号以键入一个以上的样式条件。以下的范例会执行三个比较:

    (wcmatch “Nname" “? ? ? , ~*m*, N*")  返回 T

    如果三个样式条件中有任何一个符合, 则 wcmatch 将返回T。在此测试结果为:Name 有三个字符为 (伪), Name 不包含一个 M (伪) 以及 Name 以N 为开头 (真)。至少有一个条件符合, 所以这个表达式会返回 T。

    这项比较对于大小写是有分别的, 所以大写和小写的字符必须要完全代替成功才行。使用变量和从 AutoLISP 函数返回来的值作为 string 和 pattern 的值也是可以的。如果您需要在一个字符串中测试一个通配符, 则您可以使用一个反引号字符(`)以跳开该字符。“跳开”的意思是说跟在反引号后面的字符将不会被读成一个通配符, 而会使用它的本身来进行比较。例如, 要在一个字符串Name中查找一个逗号, 您可键入:

    (wcmatch "Name" "*`, *")  返回  nil

    由于其他的通配符可能在 AutoLISP 以后的版本中被加进来。因此, 最好在样式中跳开所有的非数字符, 以保证向上的兼容性。

    C和AutoLISP 这两种程序语言都是使用反斜线(\)作为一个跳离字符, 所以在一字符串中, 您需要使用两个反斜线(\\)来产生一个反斜线(\)。要在Name 中测试一个反斜线字符 (\), 您可以键入:

    (wcmatch "Name" "*`\\*") 返回 nil

    所有括在中括号中的字符([...])都会按照字母顺序来读取, 所以不需要跳开它们, 但以下的例外:浪纹连接号(~)只有在它不是第一个被括起来的字符对(如“[A~BC]”), 才会被按照字母顺序读进来, 否则它会被读成反义字符。这表示可代替到跟在浪纹连接号后面的字符以外的所有字符(如:“[~ABC]”)。连字字符(-), 只有当它是第一个或最后一个被括起来的字符(如“[-ABC]”或“[ABC-]”), 或跟在开头浪纹连接号后面(如“[~ABC]”)时, 它才会被按照字母顺序读进来。否则连字字符将被使用于中括号中以表示一个特定字符的值的范围。这个范围只能应用于单一字符, 因此, “STR[1-38]”可代替到 STR1、STR2、STR3 和 STR8, 而“[A-Z]”可代替到任何单一的大写字母。

    对于中括号字符 (“]”), 只有当它是一个第一个被括起来的字符或跟在毛毛虫的后面 (如“[ABC]”或“[~ABC]”) 时, 它才会被按照字母顺序读进来
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-10-25 23:45:00 | 显示全部楼层
其实我很早以前就提出这个问题了(*代表什么),只是不了了之了
"*bc*c*" "11bc22bc" 当然每个*都有答案
"*bc*c*" "11bcbc22bcbcbc"看来是有n个解.

很多时候其实和密码一样,反过推是没结果的.


又:
"*bc*c*" "11bcbc22bcbcbc"
按wcmatch的逻辑,第二个*应该是b,第三个22bcbcbc
如果按这个逻辑有可能写出来.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-26 00:08:38 | 显示全部楼层
又:
"*bc*c*" "11bcbc22bcbcbc"
按wcmatch的逻辑,第二个*应该是b,第三个22bcbcbc
如果按这个逻辑有可能写出来.

我觉得按这个规则就好了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-16 11:52 , Processed in 0.351508 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表