正则表达式匹配多行注释
我的尝试
/\*.*\*/
但是这只能识别单行注释,在Java中,有两种方法识别多行注释:
Pattern.compile("(?s)/\\*.*\\*/")
Pattern.compile("/\\*.*\\*/", Pattern.DOTALL)
但是这会吞并两个注释间的所有的代码:
start_code();
/* First comment */
more_code();
/* Second comment */
end_code();
Solutions
- 正则表达式中的
*
是贪婪匹配,而*?
是非贪婪匹配,下面的正则使用非贪婪匹配(需添加Pattern.DOTALL
选项)
`/\*.*?\*/`
- 有的正则实现不支持非贪婪匹配,则可以使用下面的正则:
`/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/`
- 无意间发现的一个Trick,既可以多行,又是非贪婪匹配
`/\*[\w\W]*?\*/`
这里的\w\W可以使用任意相反的字符类,比如\d\D
, \s\S
等
存在问题
被双引号包括的注释同样会被识别,所以在实际使用时应当注意这点。
参考链接
http://stackoverflow.com/questions/13014947/regex-to-match-a-c-style-multiline-comment
repr与str的区别
help(repr):
repr(...)
repr(object) -> string
Return the canonical string representation of the object.
For most object types, eval(repr(object)) == object.
返回对象的典型表示形式(Python解释器所能理解的),后面一句非常重要,对于大多数类型eval(repr(object)) == object
help(str):
class str(basestring)
| str(object) -> string
|
| Return a nice string representation of the object.
| If the argument is a string, the return value is the same object.
返回对象的字符串表示(能打印出的人们能理解的)
这样一来,就很好区别了。再来两个例子:
>>> s = "this is a string" >>> str(s) 'this is a string' >>> repr(s) "'this is a string'" >>> l = [ "l", "i", "s", "t" ] >>> str(l) "['l', 'i', 's', 't']" >>> repr(l) "['l', 'i', 's', 't']"