站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
▼
建站程序
开发
服务器
办公软件
开发教程
▼
服务器教程
软件使用教程
运营教程
热门电子书
▼
CSS教程
WordPress教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
热点词条
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
Ruby-标准类型
”(章节)
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
== 基于模式的替换 == 有时候在字符串中找出一个模式已经非常不错了。比方说,如果你的朋友要向你挑战,让你找到包含a,b,c,d,e这5个字母并且这5个字母还是按着次序排列的单词,你可以用/a.*b.*c.*d.*e/这个模式来搜索单词列表,最后会发现"absconded"和"ambuscade"。这毫无疑问是非常有用的。<br> 但是,也有时候你需要在模式匹配的基础上修改一些什么东西。让我们回过头来看看我们的歌曲列表文件。创建文件的人在输入的时候把作者名都打成小写了,如果显示到点唱机的屏幕上,混合大小写看起来还是要好看得多。那我们怎样把每个单词的首字母修改成大写呢?<br> 方法String#sub和String#gsub都在字符串中搜索匹配第一个参数的部分,然后用第二个参数来替换它们。String#sub只替换一次,而String#gsub替换所有找到的匹配。都返回一个包含了替换的新的字符串的拷贝。进化版本是String#sub!和String#gsub!,它们修改原始字符串。<br> a = "the quick brown fox" <br> a.sub(/[aeiou]/, '*') >> "th* quick brown fox" <br> a.gsub(/[aeiou]/, '*') >> "th* q**ck br*wn f*x" <br> a.sub(/\s\S+/, '') >> "the brown fox" <br> a.gsub(/\s\S+/, '') >> "the" <br> 两个方法的第二个参数既可以是字符串,也可以是代码块。如果是代码块,代码块的值被替换成字符串。<br> a = "the quick brown fox" <br> a.sub(/^./) { $&.upcase } >> "The quick brown fox" <br> a.gsub(/[aeiou]/) { $&.upcase } >> "thE qUIck brOwn fOx" <br> 这看上去像我们要转换作者名字的答案。匹配字的第一个字符的模式是\b\w,寻找一个字边界后跟一个字字符。再使用gsub我们还可以把作者名字分开。<br> def mixedCase(aName) <br> aName.gsub(/\b\w/) { $&.upcase } <br> end <br> mixedCase("fats waller") >> "Fats Waller" <br> mixedCase("louis armstrong") >> "Louis Armstrong" <br> mixedCase("strength in numbers") >> "Strength In Numbers" <br> 反斜线序列用在替换中<br> 早先我们提到过\1、\2等序列可以在模式中使用,代表第n组匹配。同样这些序列也可以用作sub和gsub的第二个参数。<br> "fred:smith".sub(/(\w+):(\w+)/, '\2, \1') >> "smith, fred" <br> "nercpyitno".gsub(/(.)(.)/, '\2\1') >> "encryption" <br> 还有一些反斜线序列用在替换字符串上:<br> \& 后面的匹配<br> \+ 后面的匹配组<br> \` 匹配前面的字符串<br> \' 匹配后面的字符串<br> \\ 反斜线的字面值<br> 如果你要在替换中包含一个字面上的反斜线,可能会搞乱,很自然会有下面的写法:<br> str.gsub(/\\/, '\\\\') <br> 显而易见,这段代码试图把str中的每一个反斜线替换成两个。把替换文本中的反斜线挤在一起写的程序员知道,在语法分析时它们会被转换成"\\",但是,当替代发生的时候,正则表达式引擎通过字符串又执行一次转换,把"\\"转换成了"\",这样叠加的效果就是把每一个反斜线替换成另外的一个反斜线。你需要这样写:gsub(/\\/, '\\\\\\\\')! <br> str = 'a\b\c' >> "a\b\c" <br> str.gsub(/\\/, '\\\\\\\\') >> "a\\b\\c" <br> 不过,既然知道了\&会被匹配到的字符串替换,所以也可以写成:<br> str = 'a\b\c' >> "a\b\c" <br> str.gsub(/\\/, '\&\&') >> "a\\b\\c" <br> 如果你使用gsub的代码块形式,那么替换字符串只被分析一次(被语法检查),结果就是你期望的那样。<br> str = 'a\b\c' >> "a\b\c" <br> str.gsub(/\\/) { '\\\\' } >> "a\\b\\c" <br> 最后,看一个非常好的展现正则表达式和代码块的组合的例子,接下来的代码片断来自CGI库模块,由Wakou Aoyama编写。代码取得包含HTML转义序列的字符串,然后把它转换成正常的ASCII码。因为它是写给日本用户的,所以在正则表达式上使用了"n"修饰符,它跳过了Wide-character的处理过程,它也展示了Ruby的Case表达式<br> def unescapeHTML(string)<br> str = string.dup<br> str.gsub!(/&(.*?);/n) {<br> match = $1.dup<br> case match<br> when /\Aamp\z/ni then '&'<br> when /\Aquot\z/ni then '"'<br> when /\Agt\z/ni then '>'<br> when /\Alt\z/ni then '<'<br> when /\A#(\d+)\z/n then Integer($1).chr<br> when /\A#x([0-9a-f]+)\z/ni then $1.hex.chr<br> end<br> }<br> str<br> end<br> puts unescapeHTML("1<2 && 4>3")<br> puts unescapeHTML(""A" = A = A") <br> 结果:<br> 1<2 && 4>3<br> "A" = A = A <br>
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)