《Ruby for Rails 中文版》071124

第12章 正则表达式和基于它的字符串操作

要匹配特殊字符,需要使用反斜杠来对它们进行转义。如:需要匹配字符问号,需要这样编写代码:
/\?/
反斜杠的含义是“请不要将下一个字符当作特殊字符处理;请将它们当成本身处理。”
特殊字符包括^、$、?、.、/、\、[、]、{、}、(、)、+、*、

有时想在模式中的某个位置匹配任意的字符,可以使用特殊的同配字符.(圆点)。
/ejected/
匹配dejected和rejected。也匹配%ejected和8ejected。

字符集
字符集是明确的字符列表,放在正则表达式中的中括号里:
/[dr]ejected/
表示“匹配d或r,其后接ejected”
在字符集中,也可以插入字符范围。如:
插入所有小写字母:/[a-z]/
/[A-Fa-f0-9]/匹配从a到f中的任何一个字符(大写或小写)或任何一个数字
如果在字符集的开头加一个脱字符号(^),可以实现否定类型的查找。如:
肥十六进制数字匹配的字符集:/[^A-Fa-f0-9]/

常见字符集的特殊转义序列
要与任何一个数字匹配:/[0-9]/
也可以使用更简洁的特殊转义序列:/\d/
另外2个有用的预定义字符集的转义序列是:
\w  与任何数字、字幕或下划线(_)想匹配
\s  与任何空白字符相匹配。
这些预定义字符集每一个都有一个补集。要与任何一个非数字的字符匹配,可以使用:
/\D/
\W与数字、字幕或下划线之外的任何一个字符相匹配,\S与任何一个肥空白字符串匹配。

用小括号来捕获子匹配
$1包含的是正则表达式中从左侧开始的第一对小括号内的子模式所匹配的字符串。变量$n包含正则表达式中从左侧开始的第n对小括号内的字模式所匹配的字符串。

正则表达式记法有一个用来表示“0个或1个”这种情形的特殊字符:问号(?)
/Mrs?\.?/
s后面的问号表示此位置有一个s或没有一个s的字符串都能与该模式匹配。后面跟这一个问号的圆点来说,也是同样道理(反斜杠表示这是一个实际的圆点,而不是一个特殊的圆点通配符)
情况“0个或多个”需要使用星号*
/<\s*\/\s*p\s*>/
每一次序列\S*出现,都表示匹配的字符串在此模式中出现数目不确定的空白符——包括0个。
量词“一个或多个”用一个加号(+)表示
/\d+/匹配由一个或多个连续的数字构成的任意序列。

特定的次数重复
明确指定子模式的具体重复次数,可以通过将一个数放在大括号中:
/\d[3]-\d[4]/
该模式与555-1212及其他与电话号码类似的序列匹配。
也可以在大括号中指定一个范围:
/\d[1,10]/
该模式与含有1-10个连续数字的任意字符串相匹配。

可以在正则表达式中执行字符串内插操作。使用#{...}
str="def"
"def"
/abc#{str}/
/abcdef/
在把字符串放入正则表达式之前,可以转义字符串中的特殊字符Regexp类提供了Regexp.escape类方法,可以来做这件事。
Regexp.escape("a.c")
"a\\.c"
Regexp.escape("^abc")
\\^abc

String#scan
scan方法从左到右扫描一个字符串,重复地进行测试以寻找指定模式的各个匹配。结果返回到一个数组中。如:
>>"testing 1 2 3 testing 4 5 6".scan{/\d/}
=>["1","2","3","4","5","6"]
如果在传递给scan的正则表达式中使用了小括号分组,它返回一个数组的数组。
>>str = "Leopold Auer was the teacher of Jascha Heifetz."
=>"Leopold Auer was the teacher of Jascha Heifetz."
>>violinists = str.scan(/A\[A-Z]\w+\)\s+([A-Z]\w+/)
=>[["Leopold","Auer"],["Jascha","Heifetz"]]

String#split
>>"Ruby".split(//)
=>["R","u","b","y"]

sub/sub! gsub/gsub!
sub接受两个参数:一个正则表达式和一个替代字符串。无论字符串的那一部分与正则表达式相匹配,该部分被删除,然后用替代字符串来取代它
>>"typigraphical error".sub(/i/,"o")
=>"typographical error"
gsub与sub类似,但是也有不同。不同之处是,只要字符串的剩余部分还能够与模式匹配 ,gsub就会继续进行替代。
>>"capitalize every word".gsub(/\b\w/){|s| s.upcase}
=>"Capitalize Every Word"
\b表示单词边界

grep
grep属于Enumerable模块而不属于String类。grep直接基于正则表达式参数进行选择操作。把与作为参数提供的正则表达式匹配的所有元素都返回到一个数组中:
>>["USA,"UK","France","Germany"].grep(/[a-z]/)
=>["France","Germany"]
也可以使用select完成同样的事:
["USA,"UK","France","Germany"].select{|c|/[a-z]/.match(c)}
grep只能用来选择字符串——而且不会在字符串和数之间进行自动转换,比如运行下面的代码,会得到一个空数组:
[1,2,3].grep(/1/)
因为数组中没有能与正则表达式/1/匹配的字符串元素。

你可能感兴趣的:(C++,c,正则表达式,Ruby,Rails)