谕猛子

随心飞翔 http://weibo.com/busoro

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

=========================================================
本使用说明与 把VIM打造成IDE 配套
=========================================================
0 快捷键和命令
F1       ---  帮助
F2       ---  移动到下一标签
F3       ---  在工程中查找
F4       ---  全部退出
F5       ---  全部保存
F6       ---  代码补全 ( insert模式 )
F7       ---  编译项目
F8       ---  重新编译项目
F9       ---  cscope快捷键用的
F10      ---  生成当前目录的tags
<C-X>F10 ---  生成当前目录的cscope
<C-C>F10 ---  清除当前目录的tags和cscope
F11      ---  打开或关闭 Taglist
F12      ---  打开或关闭 WinManager ( 文件列表,tag列表 )
<C-A>    ---  清除屏幕中 搜索产生的高亮
fd       ---  提示当前光标所在函数的定义
fg       ---  生成 Doxygen 风格的注释

命令:
:A            打开.cpp和.h对应的文件
:AV           打开.cpp和.h对应的文件,并且分屏

:Csm path     生成指定目录的cscope.out
:Csc path     清除指定目录的cscope.out
:Csl path     装载指定目录的cscope.out

:set tags=/.../tags  将tags文件加入到vim中来
:Tlist        打开/关闭taglist窗口

cscope的快捷键 参看后面的cscope的说明
<F9>s  ---  查找本符号(可以跳过注释)
<F9>g  ---  查找本定义
<F9>f  ---  查找本文件
<F9>i  ---  查找包含本文件的文件
<F9>t  ---  查找本字符串
<F9>e  ---  查找本 egrep 模式
<F9>d  ---  查找本函数调用的函数
<F9>c  ---  查找调用本函数的函数

<C-]>  ---  查找 tag  ( 按CTRL,然后按] )
<C-T>  ---  跳回原来的地方  ( 在tag堆栈中返回 )

折叠相关的快捷键
    空格    展开/关闭 折叠
    zR     打开所有的折叠
    za     Open/Close (toggle) a folded group of lines.
    zA     Open a Closed fold or close and open fold recursively.
    zi     全部 展开/关闭 折叠
    zo     打开 (open) 在光标下的折叠
    zc     关闭 (close) 在光标下的折叠
    zC     循环关闭 (Close) 在光标下的所有折叠
    zM     关闭所有可折叠区域

1 光标移动
hjkl           ---  上下左右移动光标 (命令状态时)
nh             ---  向左移n个字符
nl             ---  向右移n个字符
%               ---  跳转到配对的括号(小括号,方括号,大括号都在此范围)
''             ---  返回光标上次的位置  (两个单引号)
[[               ---  回到当前函数最开始的左大括号
[{             ---  将光标移动到匹配的左括号 ( [( 同理 )
]}             ---  将光标移动到匹配的右括号 ( ]) 同理 )

fx             ---  移动光标到当前行的下一个 x 处。很明显,x 可以是任意一个字母,而且你可以使用
tx             ---  和上面的命令类似,但是是移动到 x 的左边一个位置
Fx             ---  和 fx 类似,不过是往回找

w              ---  光标往前移动一个词
b              ---  光标往后移动一个词

^              ---  移动光标到当前行的第一个字母位置
美元符        ---  移动光标到行尾
              
H              ---  移动光标到屏幕上面
M              ---  移动光标到屏幕中间
L              ---  移动光标到屏幕下面

zz             ---  光标所在行 移到在屏幕中央显示

gg             ---  文件首
G              ---  文件尾

:n             ---  去指定的行,n为行号

gd             ---  函数内查找变量定义
gD             ---  全局查找 ( 其实只能在一个文件内部,不实用 )
              
mx             ---  设置书签x ( x只能是a至z的26个字母 )
~x             ---  跳到书签x处 ( ~是1左边的键 )
mm             ---  设置书签  ( 高亮 )
F2             ---  移动到下一个书签

2 窗口
:vs            ---  横向分割 窗口
:sp            ---  纵向分割窗口
<C-W> 加 -     ---  纵向减少显示行数  ( 按CTRL,然后按减号 )
<C-W> 加 +     ---  纵向增加显示行数  ( 按CTRL,然后按加号 )

CTRL + hjkl    ---  上下左右切换窗口
<C-W><C-W>     ---  移动到下一个窗口 ( 按2次 CTRL+W )
<C-W> + 方向键 ---  上下左右切换窗口

顶部标签栏     ---  按 <C-K> 把光标移动到标签,用tab和回车可以切换文件,按D可以关闭文件
Tag List窗口   ---  上下选择 + 回车

:cw            ---  打开 QuickFix窗口 ( 编译、cscope、grep 等的输出buffer )
:ccl           ---  关闭 QuickFix窗口

:ls            ---  查看缓冲区列表
:bn            ---  切换到指定的缓冲区,n是缓冲区的编号
:e filename    ---  编辑指定的文件

3 代码整理
>> 或 <<       ---  单行,缩进或者反缩进的量由shiftwidth控制 ( 已设为4 )
n>> 或 n<<     ---  n 是行数,多行缩进或反缩进
v + >          ---  多行缩进,用 v 或 CTRL+v 选择行,然后按一次 >
v + <          ---  多行反缩进,用 v 或 CTRL+v 选择行,然后按一次 <

==             ---  单行,自动整理缩进
n==            ---  n 是行数,多行自动整理缩进
=%             ---  {} 内的代码整理
v + =          ---  多行自动整理缩进,用 v 或 CTRL+v 选择行,然后按一次 =

gg=G           ---  全文格式整理。这个效果不是很好,如果有不想缩进的部分就不要用这个

4 多行注释   ( 以下4个步骤完成 )
    ctrl+v  选好行
    I      (大写很重要)
    //      
    <Esc>   按两次

把//换成别的字符串,这个方法可以用来多行编辑相同的内容

5  删除 复制 粘贴
:a,b s/old/new  ---  替换指定的字符串,a是起始行号,b是结束行号,old是被替换的内容(支持正则表达式),new是替换后的内容

v     :按字符选择。经常使用的模式,所以亲自尝试一下它。
V     :按行选择。这在你想拷贝或者移动很多行的文本的时候特别有用。
<C-V> :按块选择。非常强大,只在很少的编辑器中才有这样的功能。你可以选择一个矩形块,并且在这个矩形里面的文本会被高亮。
   在选择模式的时候使用上面所述的方向键和命令(motion)。比如,vwww,会高亮光标前面的三个词。Vjj 将会高亮当前行以及下面两行。
一旦你高亮了选区,你或许想进行一些操作:
d     :剪贴选择的内容到剪贴板。
y     :拷贝选择的内容到剪贴板。
c     :剪贴选择的内容到剪贴板并且进入插入模式。

如果你很清楚的知道你想拷贝或者剪切什么,那你根本就不需要进入可视选择模式。这样也会节省时间:
d{motion}:剪切 motion 命令跨过的字符到剪贴板。比如,dw 会剪切一个词而 dfS 会将从当前光标到下一个 S 之间的字符剪切至剪贴板。
y{motion}:和上面类似,不过是拷贝。
c{motion}:和 d{motion} 类似,不过最后进入插入模式。

dd: 剪切当前行。
yy: 拷贝当前行。
cc: 剪切当前行并且进入插入模式。
cw: 从当前位置剪切单词,并进入插入模式
c美元符: 擦除从当前位置至行末的内容,并进入编辑模式
D:  剪切从光标位置到行尾到剪贴板。
Y:  拷贝当前行。
C:  和 D 类似,最后进入插入模式。
x:  剪切当前字符到剪贴板。
s:  和x类似,不过最后进入插入模式。
S:  删除光标所在行并进入编辑模式

y+y      将光标目前所在的位置整行复制
y+w      复制光标所在的位置到整个单词所在的位置
n+y+w    若按3yw,则会将光标所在位置到单词结束以及后面两个单词(共3个单词)一起复制
n+y+y    若按3yy,则将连同光标所在位置的一行与下面两行一起复制

粘贴很简单,按 p。

u         撤销    
ctrl+r    重做
U         将选中块中的内容转成大写

使用多重剪贴板
很多编辑器都只提供了一个剪贴板。VIM 有很多。剪贴板在 VIM 里面被称为寄存器(Registers)。
你可以列出当前定义的所有寄存器名和它们的内容,命令为“:reg”。
最好使用小写字母来作为寄存器的名称,因为大写的有些被 VIM 占用了。使用寄存器的命令为双引号"
比如:我们要拷贝当前行到寄存器 k。你应该按 “kyy。(你也可以使用 V”ky。为什么这样也可以呢?)
现在当前行应该已经存在了寄存器 k 里面直到你又拷贝了一些东西进入寄存器 k。
现在你可以使用命令 “kp 来粘贴寄存器 k 里面的内容到你想要的位置。

vim中常用的删除文本命令:
d+左方向键        连续按d和左方向键,将光标所在位置前一个字符删除
d+右方向键        将光标所在位置字符删除
d+上方向键        将光标所在位置行与其上一行同时删除
d+下方向键        将光标所在位置与下一行同时删除
d+d               连按两次d,可将光标所在的行删除,若是连续删除,可以按住d不放
d+w               删除光标所在位置的单词,若是光标在两个字之间,则删除光标后面的一个字符
n+d+d             删除包括光标所在行及乡下的n行
n+d+上方向键      删除包括光标所在行及向上的n行
n+d+下方向键      同n+d+d命令
D                 将光标所在行后面所有的单词删除
x                 将光标所在位置后一个字符删除
X                 将光标所在位置前一个字符删除
n+x               删除光标所在位置及其后的n个字符
n+X               删除光标所在位置及其前的n个字符

=========================================================
                    其它功能 使用说明
=========================================================

----------------------------------------------------------------------
1 File List 窗口的命令 说明
----------------------------------------------------------------------
<F1>  ---  显示帮助
<cr>  ---  如果光标下是目录, 则进入该目录; 如果光标下文件, 则打开该文件
-     ---  返回上级目录
c     ---  切换vim 当前工作目录正在浏览的目录
d     ---  创建目录
D     ---  删除目录或文件
i     ---  切换显示方式
R     ---  文件或目录重命名
s     ---  选择排序方式
x     ---  定制浏览方式, 使用你指定的程序打开该文件

----------------------------------------------------------------------
2 cscope 说明       :help if_cscop.txt
----------------------------------------------------------------------
cs find c|d|e|f|g|i|s|t name
    0 或 s  ---  查找本 C 符号(可以跳过注释)
    1 或 g  ---  查找本定义
    2 或 d  ---  查找本函数调用的函数
    3 或 c  ---  查找调用本函数的函数
    4 或 t  ---  查找本字符串
    6 或 e  ---  查找本 egrep 模式
    7 或 f  ---  查找本文件
    8 或 i  ---  查找包含本文件的文件
快捷键:
    <F9>s  ---  查找本符号(可以跳过注释)
    <F9>g  ---  查找本定义
    <F9>d  ---  查找本函数调用的函数
    <F9>c  ---  查找调用本函数的函数
    <F9>t  ---  查找本字符串
    <F9>e  ---  查找本 egrep 模式
    <F9>f  ---  查找本文件
    <F9>i  ---  查找包含本文件的文件

如果自动跳转的位置你不满意, 想看其他的结果, 可以用下面的命令打开QuickFix窗口
:cw

要把生成的cscope文件导入到vim中来, 用下面的命令:
:cs add /home/wooin/vim71/cscope.out /home/wooin/vim71
上面这条命令必须写全, 不能只写前半句

:cs show    ---  查看连接了哪些cscope数据库

----------------------------------------------------------------------
3 自动补全 说明
----------------------------------------------------------------------
Insert模式,按下"Ctrl+X Ctrl+O", 此时会弹出一个下列菜单, 显示所有匹配的标签
此时有一些快捷键可以用:
    Ctrl+P  ---  向前切换成员
    Ctrl+N  ---  向后切换成员
    Ctrl+E  ---  表示退出下拉窗口, 并退回到原来录入的文字
    Ctrl+Y  ---  表示退出下拉窗口, 并接受当前选项

vim中的其他补全方式还有
    Ctrl+X Ctrl+L  ---  整行补全
    Ctrl+X Ctrl+N  ---  根据当前文件里关键字补全
    Ctrl+X Ctrl+K  ---  根据字典补全
    Ctrl+X Ctrl+T  ---  根据同义词字典补全
    Ctrl+X Ctrl+I  ---  根据头文件内关键字补全
    Ctrl+X Ctrl+]  ---  根据标签补全
    Ctrl+X Ctrl+F  ---  补全文件名
    Ctrl+X Ctrl+D  ---  补全宏定义
    Ctrl+X Ctrl+V  ---  补全vim命令
    Ctrl+X Ctrl+U  ---  用户自定义补全方式
    Ctrl+X Ctrl+S  ---  拼写建议

类成员访问控制,取值:
    + : 公共(public)
    # : 保护(protected)
    - : 私有(private)
符号的类型,可能的值为
    c : 类(class)
    d : 宏(macro definition)
    e : 枚举值(enumeator)
    f : 函数(function)
    g : 枚举类型名称
    m : 类/结构/联合成员(member)
    n : 命名空间(namespace)
    p : 函数原型(function prototype)
    s : 结构体名称(structure name)
    t : 类型定义(typedef)
    u : 联合名(union name)
    v : 变量定义(variable defination)

----------------------------------------------------------------------
4 Vim中的查找/替换与正则表达式
----------------------------------------------------------------------
  Vim中的查找和替换功能相当强大,不单可以查找指定字符串,还支持正则表达式,
指定光标的位置,结合其他命令对查找结果进行操作...

4.1. 查找命令
  Vim中提供的最基本的查找命令有'/'和'?',其中,'/'用于正向查找;'?'用于反向查找。
在执行一次查找操作后,Vim会记住本次所使用的模式(pattern)和偏移量(±nlines)。
下一次使用时,只需要指定查找的方向(和/或新的偏移量)即可。

4.1.1 '/'命令
'/'为正向查找命令,即从光标所在位置起向后/下查找。
    命令                说明
/{pattern}                正向查找指定模式pattern
/{pattern}/[±]offset    正向查找指定模式pattern;找到后,以模式所在位置为基准,以指定偏移量移动光标
/                        使用上一次模式和偏移模式进行正向查找
//[nline]                使用上一次的模式和新指定的偏移量进行正向查找;如新偏移量为空,则缺省为0

4.1.2 '?'命令
'?'为反正查找命令,即从光标所在位置起向前/上查找。
    命令                说明
?{pattern}                反向查找指定模式pattern
?{pattern}?[±]offset   反向查找指定模式pattern;找到后,以模式所在位置为基准,以指定偏移量移动光标
?                        使用上一次模式和偏移模式进行反向查找
??[nline]                使用上一次的模式和新指定的偏移量进行反向查找;如新偏移量为空,则缺省为0

4.1.3 其他查找命令
除'/'和'?'外,Vim还提供了另外几条查找命令:
  命令          说明
n               重复上一次查找操作
N               使用上一次查找操作的模式和偏移量,在相反方向上查找
*               将当前光标所在位置的单词(word①)作为搜索对象,正向查找它的下一处出处位置;
                如当前光标所在位置处不是单词,则使用其后出现的第一个单词作为搜索模式。
                查找将忽略大小写。
#               同'*',但查找方向为反向
g*              基本同'*',区别在于,'*'匹配的是单词(单词左右需要有空白定界符),而"g*"匹配的只是字符串。①
g#              基本同"#",区别同上
gd              局部声明跳转,常用于查找函数内变量的定义位置。搜索的关键字是光标所在位置处的关键字(变量名),
                搜索的范围是光标当前所在(或一个)函数(以不一定正确)。Vim会尝试从函数的开始处正向寻找此关键出现的
                第一处位置(并不一定总是变量的声明之处,而仅仅可能只是变量在函数中第一次出现的位置),如未找到,则光标保持在原位置不变。
gD              全局声明跳转,常用于查找全局变量的定义位置。类似于"gd",但查找的范围是当前文件
1gd             类同于"gd",但会忽略光标位置前结束的第一对'{'和'}'之间的代码
1gD             类同于"gD",同样会忽略光标位置前结束的第一对'{'和'}'之间的代码
Ctrl-C          中止当前正在执行的命令(搜索)
:noh[lsearch]    关闭"hlsearch"选项(高亮显示)。下一次搜索时,高度会再次打开

    Vim中的单词,指由英文大小写字母、数字和下划线构成,由特定边界(空格或制表符等空白符号,或行首/行尾标识)包围起来的字符串。
    使用'*'进行查找时,搜索的是完整的单词;而使用"g*"查找时,搜索的对象仅仅是构成单词的字符串(单词的边界并不在匹配范围之内)。
    举例来说,假定光标所在处单词为"b_c",则使用'*'进行查找时,并不会匹配"ab_cd"中的"b_c",而"g*"则会匹配成功。

4.11.4 查找中的偏移量
    偏移量用来控制'/'或'?'命令找到匹配结果后,光标位置的移动。偏移量可以是行偏移量或行内列/字符偏移量。
如未指定偏移量,则光标移动至匹配处的首字符位置。
 表达式     说明
[±lines]    指定行偏移量。以匹配结果所在行为基准,'+'(缺省)指定向下移动/'-'指定向上移动,光标同时会定位到该行的第一列。lines可省略,缺省为1
e[±cols]    指定列偏移量。以匹配结果的最后一个字符位置(end)为基准,'+'(缺省)向右移动/'-'向左移动光标cols列。cols可省略,缺省为1
s[±cols]    指定列偏移量。以匹配结果的第一个字符位置(start)为基准,'+'(缺省)向右移动/'-'向左移动光标cols列。cols可省略,缺省为1
b[±cols]    同s偏移(begin,start)

4.1.5 其他命令与选项
清除Vim缓存的查找模式
    :let @/ = ""

在查找命令之后,可以跟随一个';',再其后跟随另一条查找命令。如:
    /test/;/abc
    或
    /test/+1;/abc

回绕选项
    warpscan或ws     : 用来控制查找到文件尾后,是否回绕至文件首部继续搜索。此选项同时也控制着拼写检查命令"]s","]S","[s","[S"
    nowarpscan或nows : 不回绕开关

4.1.6 帮助
更多详细帮助信息,可上网搜索,或在Vim中使用以下命令获取在线帮助(":h"是":help"的简写形式):
:h pattern-searches

----------------------------------------------------------------------
5 perl/pcre正则表达式元字符/转义字符/量词/匹配方式
----------------------------------------------------------------------
  Linux平台上被广泛使用的正则表达式库PCRE - Perl-compatible regular expressions,
从其名字即可知道,PCRE提供的是一套与Perl中相兼容的正则表达式。

元字符(Meta-character)
    '\'      : 引用下一个元字符
    '^'      : 行首
    '.'      : 除新行(newline)外的任一字符('/s'选项将使'.'匹配新行字符)
    '美元符'      : 行尾(或结尾处新行之前字符)
    '|'      : 可选项
    '('与')' : 分组
    '['与']' : 字符类。表示一类字符集合中任意一个,方括号内可使用'-'表示范围,如[0-9];
               也可使用'^表示求补集,如[^0-9]表示除0-9外的其他字符

量词(Quantifier)
    '*'     : 0或任意次
    '+'     : 1或更多次
    '?'     : 0或1次
    {n}     : n次
    {n,}    : 至少n次
    {n, m}  : n到m次

匹配方式
    贪婪(greedy)方式  : 在模式其余部分匹配前提下,尽可能多地匹配字符
    最少匹配(minimum) : 尽可能少地匹配。量词后使用'?'表示使用最少匹配方式
    占有式            : 与贪婪方式相近,尽可能多地匹配字符,但绝不回退(backtrack,即使模式其余部分无法匹配,
                        也不减少本部分的匹配数量)。在数量词之后使用'+'表示使用占有式匹配。

转义序列
    '\t'         : 制表符(HT, TAB)
    '\n'         : 换行(LF, NL)
    '\r'         : 回车(CR)
    '\f'         : 进纸(Form Feed, FF)
    '\a'         : 报警 (Alarm, BEL)
    '\e'         : 转义(ESC)
    "\0xx"       : 八进制数值对应字符,如\033表示ESC
    "\xhh"       : 16进制数值对应字符,如\x1B表示ESC
    "\x{hhhh}"   : 16进制long型数值对应字符,如\x{263a}表示unicode SMILEY
    "\cK"        : K可以为任意字母,表示控制字符"control-K","\cK"表示如VT
    "\N{name}"   : unicode命名字符
    "\N{U+hhhh}" : unicode字符
    '\l'         : 小写下一字符
    '\u'         : 大写下一字符
    '\L'         : 小写随后字符串直至'\E'
    '\U'         : 大写随后字符串直至'\E'
    '\E'         : 结束大小写转换
    '\Q'         : 引用随后字符(禁止转义)直至'\E'

字符类及其他转义字符
    '\w'       : 匹任任一单词(word)字符(26个英文字母、10个数字,加下划线'_')
    '\W'       : 匹配任一非单词字母
    '\s'       : 任一空白字符(空格' ', 制表符'\t'等)
    '\S'       : 任一非空白字符
    '\d'       : 任一数字字符[0-9]
    '\D'       : 任一非数字字符
    “\pP”    : 匹配命名属性P
    "\PP"      : 匹配非P
    '\X'       : 匹配unicode扩展字符集(eXtended grapheme cluster)
    '\C'       : 匹配单个C字符(字节),即使工作在unicode模式下
    '\n'       : n为数字,后向引用指定组n
    "\gn"      : 后向引用指定组n
    "\g{-n}"   : 表示相对(当前位置之前的)第n个后用引用组n
    "\g{name}" : 后向引用命名组(name)
    "\k{name}" : 后向引用
    '\K'       : 使\K左侧部分,不引入到美元符&中
    '\N'       : 除'\n'外的任一字符
    '\v'       : 垂直空白符
    '\V'       : 非垂直空白符
    '\h'       : 水平空白符
    '\H'       : 非水平空白符
    '\R'       : 行分割符号

POSIX字符类表示语法:[:class:], 在pattern中则必须写为"[[:class:]]"。
    "[[:alpha:]]"  : (英文)字母
    "[[:alnum:]]"  : 字母或数字字符
    "[[:ascii:]]"  : ASCII字符集中字符
    "[[:blank:]]"  : GNU扩展,等价于空格' '或水平制表符'\t'
    "[[:cntrl:]]"  : 任一控制字符
    "[[:digit:]]"  : 任一数字字符,等价于'\d'
    "[[:graph:]]"  : 除空格外的任一可打印字符
    "[[:lower:]]"  : 任一小写字符
    "[[:print:]]"  : 任一可打印字符,包括空格
    "[[:punct:]]"  : 除单词字符(字母,'_')外的任一图形字符
    "[[:space:]]"  : 任一空白字符,等价于'\s'垂直制表符"\cK"
    "[[:upper:]]"  : 任一大写字符
    "[[:word:]]"   : Perl扩展, 等价于'\w'
    "[[:xdigit:]]" : 任一16进制数字
    Perl中,"[[^:class:]]"表示posix指定类的补集,这种情况下也可略去[::],在类名前加'^'表示为"[^class]"。

Assertion
    '\b' : 单词边界
    '\B' : 非单词边界
    '\A' : 字符串首
    '\Z' : 字符串尾或尾部换行字符之前
    '\z' : 字符串尾
    '\G' : 在上一个匹配处进行匹配

修饰符(Modifer),用来控制正则表达式匹配过程中的特定行为的控制开关。
    m : multi-line, 多行模式。'^'和'美元符'将匹配字符串中每行的行首和行尾
    s : single line,单行模式。'^'和'美元符'仅匹配字符串的首/尾;'.'将匹配包括换行符在内的任一字符
    i : case-insensitive,忽略大小写。如"use locale"项有效,则大小写映射关系取决于"locale"
    x : extend( legibility),增强模式的可读性,允许在模式中使用空格和注释
    P : Preserve,保留匹配字符串,以便在匹配结束后可继续使用 {^PREMATCH}, {^MATCH}, 和{^POSTMATCH}
    g : 全局匹配,也即在字符串中找出所有与模式相匹配的部分
    c : 与'g'配合使用。当匹配失败或目标字符串被修改后,保存当前位置

扩展模式提供了一些标准模式之外的特殊功能,形式为"(?...)"。
    (?#text)                          : 注释。若使用了"/x"选项,则括号中只需要以#号开始即可表示注释。')'被作为注释的结束标志,所以注释中不能包含')'
    (?pimsx-imsx)                     : 为械式随后的部分或未结束的模式分组设置选项p/i/m/s/x开关
    (?:pattern)或(?imsx-imsx:pattern) : 设置pattern为非捕获分组,不分配分组编号(因此不能使用后置引用),
    不保留实际匹配结果,可同时指定匹配选项开关(imsx)。
    (?|pattern)                       : 分枝重置(branch reset)。一般情况下,捕获分组的编号是由分组左括号在模式中出现的次序决定的。
    使用分枝重置表达式,则出现在表达式中的可选模式编号均重置为此表达式的编号。
    例如模式(a)(?|x(y)z|(p(q)r)|(t)u(v))(z)中,分组(x(y)z),(p(q)r)和(t)的编号均为2,而(y),(q)和(v)编号为3,(z)编号为4。
    如在分枝重置表达式中使用了命名子模式,则同编号子模式的名称应相同,如(?|(?<a>x)(?<b>y)|(?<a>z)(?<b>w))。
    如在分枝重置表达式中为同一编号的子模式指定了不同名称,则模式编译时会给出告警,或出现非预期的匹配结果引用
    环顾断言(Look-Around) Assertions
    正则表达式进行模式匹配时,通常是从左至右分别扫描模式和字符串进行匹配测试。
    而环顾断言是指在相对当前匹配位置的前(look-ahead,右侧)或后(look-behind,左)侧进行子模式是否匹配的判断。
    环顾断言是一种零宽度(zero width)断言,也就是说,即使本部分子模式匹配成功,不会占用所匹配的字符串
    (即所匹配字符串还会用来和别的子模式进行匹配),匹配结果也不会出现在完整模式的匹配结果中(\g0或美元符&)。
    (?=pattern)      : 零宽度肯定前向断言(zero-width positive look-ahead assertion)。从当前匹配位置向前(右)对子模式进行匹配,
    且子模式匹配结果不出现在完整模式的匹配结果中。例,模式"\w+(?=\t)"匹配任何其后为制表符'\t'的单词。
    注意,非捕获组(?:pattern)仅仅是不单独保留子模式的匹配结果,但不影响其在模式整体匹配结果(\g0,美元符&)中的出现;
    而零宽肯定前向断言匹配成果后会将子模式匹配结果从整体匹配结果中移除
    (?!pattern)      : 零宽度否定前向断言(zero-width negative look-ahead assertion)。当前匹配位置的右侧不能匹配指定子模式pattern。
    例:"foo(?!bar)"匹配任何其后不为"bar"的"foo"。注意:模式"(?!foo)bar"看上去似乎像要匹配任何前面不是"foo"的bar,
    但事实上并非如此。这个模式会匹配任何"bar",因为"(?!foo)bar"中"子模式(?!foo)"的含义为“右侧不能为foo",
    而模式中指定了右侧子模式为"bar",只要子模式"bar"匹配成功,"?!foo)bar"必然成功。也就是说"(?!foo)bar"等同于"bar"
    (?<=pattern)或\K : 零宽肯定后向断言(zero-width positive look-behind assertion)。从当前匹配位置向后(左)对子模式进行匹配判断,
    且即使匹配成功子模式匹配结果也不能出现在"\g0"或"美元符&"中。例如:"(?<=\t)\w+"匹配任何跟在制表符'\t'之后的单词。
    注意:向后/左查找模式的宽度必须为固定值(或在一个有限范内)。'\K'是一种特殊形式的零宽后向断言,
    匹配引擎会"保存(Keep)"'\K'左侧的匹配结果,将其从最终完整匹配结果中移除。
    (?<!pattern)     : 零宽度否定后向断言。如模式"(?<!bar)foo"匹配前面不是"bar"的"foo",向后查找模式宽度必须为固定值(或在有限范围内)

posted on 2014-03-13 13:48  谕猛子  阅读(484)  评论(0编辑  收藏  举报