浅谈lisp与shell中转义字符和正则表达 (二)

来源:互联网 发布:自学java好难过 编辑:程序博客网 时间:2024/06/12 00:50


 正则表达式:我们应该也都了解一些正则表达式在Unix shell中的用法,但是还是有点区别,it is similar to those used by the language Perl, editors like ed and vi and Unix software tools like lex and grep.

program.* 在Emacs中表示以program开头的程序,而在Unix shell中它是program*

[a-e].*   match all filenames beginning with a through e in Emacs, but in Unix shell it is [a-e]*


(replace-regexp "fred\\*" "bob*")

根据replace-regexp的语法定义,第一个参数是作为正则表达式,而第二个就是一个单纯的字符串。所以第一个的匹配形式是fred后面跟了一个字面*。因为在lisp中\是一个字符串的转义字符,而转义字符就是能够实现普通到特别,特别到普通的功效。

字符串中肯定都有一个转义字符,基本上就是backslash,因为标识字符串的引号如果出现在字符串中就得必须转义,然后就是字符串的值的问题了,也就是说当普通字符碰到\时它会输出什么。


一般都是把字符串的值,输入到格式化显示的函数里面。只要你读入到格式化函数时的值为两个字符\n,他就会输出换行。也就是说制表符只有在一定的条件下才能出现相应的特效。否则就是一个个普通的字符。

lisp如下,现在一个个分析:

"\n"   因为\是转义字符,所以\n的值就是n,所以当显示的时候就成了"n"这种显示似乎比较顺理,注意等着跟shell中对它的处理比较。

"\\n"  在字符串中\\值应该是\,所以说"\\n"应该等于\n(\指的是普通字符),但是你发现它显示的形式仍旧是字符串形式,并且\n的字符串形式为"\\n",所以最后也就显示为"\\n"

"\\\n" 字符串中\\等于\,而\n等于n,整个就等于\n,但是因为它输出的是一个字符串形式,所以就又输出形式"\\n"

format 的例子,主要是考虑既然只要到格式化显示函数的时候为\n就能够显示换行,所以我就感觉针对lisp的话,第二个format形式应该输出换行。你发现它尽管输出了\n但是它没有换行的功能,其实lisp中的换行是通过字符~%或~&实现的。但是现在有个问题,你会发现format的例子一,比较眼熟,好像我们在java/shell/C中输出换行的形式都是printf "hello world \n",他们里面都是单个的\。按照lisp中\n ->n的话,进入到printf的时候是hello world n。怎么n也实现了换行?下面就带着这个问题看下面shell部分的测试和它与lisp针对string显示的区别。


shell中分为加引号与不加引号两种情况,与lisp对比:

1: hello world这种symbol的值是hello world;而如果在lisp中的话,它会报错unbound.

2: echo 语句的第1,4,5进行对比参考的话,因为string中\具有转义效果是毋庸置疑的,但是现在"\n"的值是\n而不是n,等会在输出的时候你就会发现这样的益处了。


shell中的输出形式:

第2,3个形式一样的输出形式,因为他们到printf函数的时候的值都是hello world \n,但是你发现第4个却没有输出换行,究其原因最后一步输出"\\\n"给出了答案,因为它输入给printf的值是hello world \\n,\被转义成普通字符,所以最后输出的时候为\n。现在你看到为啥shell 碰见"\n",仍旧输出值\n的好处了吧,因为不是这样的话,我们在printf的时候就需要为第3个printf函数的形式。基本上其它像C/Java都是这么默认的,所以对于lisp的话,要格外注意一下。


总结:上面的这么多描述,实际上就是为了说明在调用格式化函数之前譬如\n他们就是两个单独的字符,而格式化函数赋予了他们制表符的功效。并且限制住它在到达格式化函数时的值的形式为\n,\t,\v等之类特殊字符就可以实现相应的功能。


^_^,说了这么多上面"fred\\*"所表达的匹配就应该清楚了把,因为它到达格式化函数的时候值为fred\*,然后*被转义成普通字符....

注意点:如果你是通过M-x replace-regexp enter形式输入的话,输入fred\*而不是fred\\*


浅谈lisp与shell中转义字符和正则表达 (一)

原创粉丝点击