-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
248 lines (179 loc) · 16.1 KB
/
atom.xml
File metadata and controls
248 lines (179 loc) · 16.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[i => { :code4fun }]]></title>
<link href="http://krolltech.github.com/atom.xml" rel="self"/>
<link href="http://krolltech.github.com/"/>
<updated>2012-08-25T15:17:58+08:00</updated>
<id>http://krolltech.github.com/</id>
<author>
<name><![CDATA[zhuoyikang]]></name>
</author>
<generator uri="http://octopress.org/">Octopress</generator>
<entry>
<title type="html"><![CDATA[ruby正则表达式]]></title>
<link href="http://krolltech.github.com/blog/2012/08/25/blogtest/"/>
<updated>2012-08-25T09:17:00+08:00</updated>
<id>http://krolltech.github.com/blog/2012/08/25/blogtest</id>
<content type="html"><![CDATA[<h3>1.定义方法</h3>
<p>在ruby中可以使用以下反斜线//和%r() ,%r||定义正则表达式:</p>
<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="sr">/Ruby/</span> <span class="c1">#匹配单词Ruby</span>
</span><span class='line'><span class="sr">/[Rr]uby/</span> <span class="c1">#匹配单词 Ruby 或 ruby</span>
</span><span class='line'><span class="sr">/^abc/</span> <span class="c1">#匹配行首的abc</span>
</span><span class='line'><span class="sr">%r(xyz$)</span> <span class="c1">#匹配行尾的xyz</span>
</span><span class='line'><span class="sr">%r|[0-9]*|</span> <span class="c1">#匹配数字由0-9数字组成序列,0次或多次.</span>
</span></code></pre></td></tr></table></div></figure>
<h3>2.修饰符</h3>
<p>可以在正则表达式后提供一些修饰符,以达到特殊的匹配意义:</p>
<table style="width:100%;">
<tr><td style="width:10%;"> 符号</td> <td style="text-align:left;"> 意义</td></tr>
<tr><td><b>i</b></td><td style="text-align:left;">如果在修饰符中加上”i”,则正则将会取消大小写敏感性,即”a”和”A” 是一样的。</td></tr>
<tr><td><b>o</b></td><td style="text-align:left;"></td> </tr>
<tr><td><b>m</b></td><td style="text-align:left;">默认的”.”代表除了换行符以外的任何字符将会变成任意字符,也就是包括换行符!</td</tr>
<tr><td><b>x</b></td><td style="text-align:left;">扩展正则表达式,允许空白,注释等</td</tr>
</table>
<p>演示一下修饰符的作用:</p>
<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># i修饰</span>
</span><span class='line'><span class="sr">/good/i</span> <span class="o">=~</span> <span class="s1">'GOOD'</span> <span class="c1">#=> 0 匹配成功</span>
</span><span class='line'><span class="sr">/good/</span> <span class="o">=~</span> <span class="s1">'GOOD'</span> <span class="c1">#=> nil 匹配失败</span>
</span><span class='line'><span class="c1"># m修饰</span>
</span><span class='line'><span class="sr">/go.*od/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"good</span><span class="se">\n</span><span class="s2">good"</span><span class="p">)</span> <span class="o">=></span> <span class="c1">#<MatchData "good"></span>
</span><span class='line'><span class="sr">/go.*od/m</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"good</span><span class="se">\n</span><span class="s2">good"</span><span class="p">)</span> <span class="o">=></span> <span class="c1">#<MatchData "good\ngood"></span>
</span><span class='line'><span class="c1"># x修饰</span>
</span><span class='line'><span class="s2">"good"</span><span class="o">.</span><span class="n">gsub!</span><span class="p">(</span><span class="sr">/o o/</span> <span class="p">,</span><span class="s2">"i"</span><span class="p">)</span> <span class="o">=></span> <span class="kp">nil</span>
</span><span class='line'><span class="s2">"good"</span><span class="o">.</span><span class="n">gsub!</span><span class="p">(</span><span class="sr">/o o/x</span> <span class="p">,</span><span class="s2">"i"</span><span class="p">)</span> <span class="o">=></span> <span class="s2">"gid"</span> <span class="c1">#忽略空白</span>
</span></code></pre></td></tr></table></div></figure>
<h3>3.匹配代号</h3>
<p>以下是一些简单的字符匹配,相信学习过正则的人都清楚:</p>
<table style="width:100%;">
<tr><td style="width:10%;"> 符号</td> <td style="text-align:left;"> 意义</td></tr>
<tr><td><b>^</b></td><td style="text-align:left;">一行或者是字符串的开头</td></tr>
<tr><td><b>$</b></td><td style="text-align:left;">一行或者是字符串的末尾</td></tr>
<tr><td><b>.</b></td><td style="text-align:left;">除换行符外的所有字符</td></tr>
<tr><td><b>/w</b></td><td style="text-align:left;">字母,数字,下划线</td> </tr>
<tr><td><b>/W</b></td><td style="text-align:left;">除字母,数字,下划线以外的字符</td> </tr>
<tr><td><b>/s</b></td><td style="text-align:left;">空格,\t换行符号</td</tr>
<tr><td><b>/S</b></td><td style="text-align:left;">除了空格,\t换行符号以外的字符</td></tr>
<tr><td><b>/d</b></td><td style="text-align:left;">数字字符</td></tr>
<tr><td><b>/D</b></td><td style="text-align:left;">非数字字符</td> </tr>
<tr><td><b>/b</b></td><td style="text-align:left;">单词边界</td></tr>
<tr><td><b>/B</b></td><td style="text-align:left;">非单词边界</td> </tr>
</table>
<h3>4.量词符号</h3>
<p>以下符号用来提供可选,重复次数等含义:</p>
<table style="width:100%;">
<tr><td style="width:10%;"> 符号</td> <td style="text-align:left;"> 意义</td></tr>
<tr><td><b>*</b></td><td style="text-align:left;">匹配0次或多次</td></tr>
<tr><td><b>+</b></td><td style="text-align:left;">匹配1次或多次</td></tr>
<tr><td><b>?</b></td><td style="text-align:left;">匹配0次或1次</td></tr>
<tr><td><b>{m,n}</b></td><td style="text-align:left;">匹配m到n次</td> </tr>
</table>
<h3>5.贪婪与非贪婪匹配</h3>
<p>默认情况下量词符号修饰的正则符号是贪婪匹配,简单来讲,贪婪匹配将尽可能多的匹配它修饰的正则符号,而非贪婪匹配将尽可能少的匹配它修饰的正则符号:</p>
<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="c1"># 量词+ 进行贪婪匹配,匹配一个或多个数字字符,这里它匹配了全部</span>
</span><span class='line'><span class="sr">/\d+/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"2323"</span><span class="p">)</span> <span class="o">=></span> <span class="c1">#<MatchData "2323"></span>
</span><span class='line'><span class="c1"># 量词+ 进行非贪婪匹配,匹配一个或多个数字字符,这里它匹配了一个字符</span>
</span><span class='line'><span class="sr">/\d+?/</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s2">"2323"</span><span class="p">)</span> <span class="o">=></span> <span class="c1">#<MatchData "2"></span>
</span></code></pre></td></tr></table></div></figure>
<p>这就是贪婪匹配与非贪婪匹配的区别, 不需要再多描述!</p>
<p>ruby语言中在以下量词之后加?表示进行非贪婪匹配:</p>
<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="o">*</span> <span class="o">=></span> <span class="o">*</span><span class="p">?</span>
</span><span class='line'><span class="o">+</span> <span class="o">=></span> <span class="o">+</span><span class="p">?</span>
</span><span class='line'><span class="p">{</span><span class="n">m</span><span class="p">,</span><span class="n">n</span><span class="p">}</span> <span class="o">=></span> <span class="p">{</span><span class="n">m</span><span class="p">,</span><span class="n">n</span><span class="p">}?</span>
</span></code></pre></td></tr></table></div></figure>
<h3>6.正向预查和反向预查</h3>
<p>正向预查匹配一个位置,但是不消耗其指定的匹配串.
reg = /New World(?= Dictionary| Symphony)/ 表示匹配出在Dictionary 或 Symphony 之前的 New World,但是这次匹配并不消耗Dictionary 或Symphony 。</p>
<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">s1</span> <span class="o">=</span> <span class="s2">"New World Dictionary"</span>
</span><span class='line'><span class="n">s2</span> <span class="o">=</span> <span class="s2">"New World Symphony"</span>
</span><span class='line'><span class="n">s3</span> <span class="o">=</span> <span class="s2">"New World Order"</span>
</span><span class='line'><span class="n">reg</span> <span class="o">=</span> <span class="sr">/New World(?= Dictionary| Symphony)/</span>
</span><span class='line'><span class="n">reg</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">s1</span><span class="p">)</span> <span class="o">=></span> <span class="c1">#<MatchData "New World "></span>
</span><span class='line'><span class="n">reg</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">s2</span><span class="p">)</span> <span class="o">=></span> <span class="c1">#<MatchData "New World"></span>
</span><span class='line'><span class="n">reg</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">s3</span><span class="p">)</span> <span class="o">=></span> <span class="c1">#nil</span>
</span></code></pre></td></tr></table></div></figure>
<p>反向预查则刚好相反,看看代码你就知道了:</p>
<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">s1</span> <span class="o">=</span> <span class="s2">"New World Dictionary"</span>
</span><span class='line'><span class="n">s2</span> <span class="o">=</span> <span class="s2">"New World Symphony"</span>
</span><span class='line'><span class="n">s3</span> <span class="o">=</span> <span class="s2">"New World Order"</span>
</span><span class='line'><span class="n">reg</span> <span class="o">=</span> <span class="sr">/New World(?! Dictionary| Symphony)/</span>
</span><span class='line'><span class="n">reg</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">s1</span><span class="p">)</span> <span class="o">=></span> <span class="kp">nil</span>
</span><span class='line'><span class="n">reg</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">s2</span><span class="p">)</span> <span class="o">=></span> <span class="kp">nil</span>
</span><span class='line'><span class="n">reg</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">s3</span><span class="p">)</span> <span class="o">=></span> <span class="c1">#<MatchData "New World"></span>
</span></code></pre></td></tr></table></div></figure>
<h3>7.特殊符号</h3>
<p>以下模式被赋予了特殊的含义:</p>
<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="sr">/[[:alnum:]]/</span> <span class="c1"># 等价于 [0-9a-zA-z]</span>
</span><span class='line'><span class="sr">/[[:alpha:]]/</span> <span class="c1"># 等价于 [a-zA-Z]</span>
</span><span class='line'><span class="sr">/[[:blank:]]/</span> <span class="c1"># 空格或 tab</span>
</span><span class='line'><span class="sr">/[[:cntrl:]]/</span> <span class="c1"># ctrl</span>
</span><span class='line'><span class="sr">/[[:digit:]]/</span> <span class="c1"># [0-9]</span>
</span><span class='line'><span class="sr">/[[:graph:]]/</span> <span class="c1"># 非空白字符 (excludes spaces, control characters, and similar)</span>
</span><span class='line'><span class="sr">/[[:lower:]]/</span> <span class="c1"># 等价于 [a-z]</span>
</span><span class='line'><span class="sr">/[[:print:]]/</span> <span class="c1"># Like [:graph:], but includes the space character</span>
</span><span class='line'><span class="sr">/[[:punct:]]/</span> <span class="c1"># Punctuation character</span>
</span><span class='line'><span class="sr">/[[:space:]]/</span> <span class="c1"># 空白字符 ([:blank:], 换行,回车, 等.)</span>
</span><span class='line'><span class="sr">/[[:upper:]]/</span> <span class="c1"># 大写字符,[A-Z]</span>
</span><span class='line'><span class="sr">/[[:xdigit:]]/</span> <span class="c1"># 16进制数,等价于 [0-9a-fA-F] (i.e., 0-9a-fA-F)</span>
</span><span class='line'><span class="sr">/[[:word:]]/</span> <span class="c1"># A character in one of the following Unicode general</span>
</span><span class='line'> <span class="c1"># categories Letter, Mark, Number, Connector_Punctuation</span>
</span><span class='line'><span class="sr">/[[:ascii:]]/</span> <span class="c1"># A character in the ASCII</span>
</span></code></pre></td></tr></table></div></figure>
<figure class='code'><figcaption><span> (test.rb)</span> <a href='http://krolltech.github.com/downloads/code/test.rb'>download</a></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="nb">puts</span> <span class="s2">"test ruby"</span>
</span></code></pre></td></tr></table></div></figure>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Awesome code snippet</span></code></pre></td></tr></table></div></figure>
]]></content>
</entry>
</feed>