|
|
在编辑文本时,如果要找到一段文字的位置,相信大家都会知道用搜索功能吧,但如果这段文字不是固定的(不过有一定规律),这时候怎么搜索呢?
举个栗子,我想要找到一段以abc开头、中间3个任意字符、以def结尾的文字,像abc123def、abcwwwdef都符合条件,这时候传统的文字搜索是无法满足需求的。
其实在强大的正则表达式面前,这种需求是小意思,你只需要输入abc...def,同时启用正则表达式,就可以搜索到了。
在正则表达式中,英文句号 . 代表除了换行符以外的任意一个字符(划重点),三个点就代表三个任意字符,所以 abc...def 就满足了上面例子中提到的要求。
现在改下条件,我想要找到一段以abc开头、中间零或多个K、以def结尾的文字,例如abcdef、abcKdef、abcKKKdef,这时候该怎么办?
在正则表达式中,星号 * 代表匹配前一个字零次或多次(划重点),所以 abcK*def 就是答案了(不截图了,自己去MT管理器中尝试)。
与 * 类似的,+ 表示匹配最少一次,? 表示匹配零次或一次(划重点)。
同时,* + ? 可以与我们前面提到的 . 结合使用,abc.+def 就表示以abc开头,中间有一个以上的任意字符,以def结尾的一段文字,例如abcHaHaHaHadef。
上面提到的四个符号,可以说是正则表达式中最常用,也是最简单的,但光学了这四个符号远远不够。
因为 . 表示的是除了换行符之外的任意字符,但是这个范围太广了,有时候我希望一个符号来表示数字、字母、空白符等等,这时候需要用到中括号[]。
例如[0123456789]可以匹配0到9这十个数字中的任意一个,当然这么写太麻烦了,因为他们是连续的,你可以简写成[0-9],同样的还有[a-z]表示字母。
如果要同时表示数字和字母呢?那就使用[0-9a-z],如果要同时表示数字和字母和下划线,可以写成[0-9a-z_]。
另一种情况就是排除匹配法,比如[0-9]代表数字,那我想要找不是数字的符号呢?只需要写成[^0-9],另外两个例子也是一样[^0-9a-z]、[^0-9a-z_]。
正则表达式还提供了一些符号来代表某些字符,\n代表换行符,\s代表空白符(等价于[ \f\n\r\t\v]),\S代表非空白符(等价于[^ \f\n\r\t\v]),\d代表数字(等价于[0-9]),\D代表非数字(等价于[^0-9]),^代表一行开头,$代表一行的结尾(MT管理器中自动开启了正则多行模式,^$代表的是一行的开头和结尾,在其它软件中如果没有开启则代表的是一段文字的开头和结尾)。
前面提到的 * + ? 都是匹配前一个字N次,但是我想匹配连在一起的几个字N次呢?那就用括号把这几个字扩起来,例如 (abc)+ 就可以匹配到 abcabcabc。
大家看到这可能还有个疑问,比如 * 代表匹配前一个字N次,那我单纯地像搜索 * 这个字,不希望它代表其它含义呢?这时候只需要在前面加个 \ ,也就是 \*,其它特殊符号也是一样的,另外用 \\ 来代表一个 \。
就先说这些吧,都是比较简单和常用的,想了解更多正则表达式的知识可以去查百度百科。
现在举个实例帮助大家消化:
在Dex编辑器++中,如果我们用正则表达式找出所有onCreate方法:
.method public onCreate(Lxxxxxxxx;)V
首先我们要找出规律,所有方法都是以.method开头,接着是public、protected、abstract之类的修饰符,接着是方法名onCreate,方法名后面是: (参数列表)返回值类型
所以我们可以这么写(搜索类型选择代码):
\.method .*onCreate
其中 \.method 的 . 是特殊符号,所以前面加\;修饰符直接用 .* 表示。
不过测试后发现这个表达式把类似 onCreateMenu 之类的方法也给找出来了,所以我们需要在 onCreate 后面继续加条件。
\.method .*onCreate *\(
这边我加入了 *\(,注意 * 前面有个空格(因为方法名和左括号之间可以有零或多个空格)。然后括号是特殊符号,需要加个\
搜索结果如下:
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +4
金币 +5
|