雷林鹏分享:Ruby 字符串(String)
Ruby 字符串(String)
Ruby 中的 String 对象存储并操作一个或多个字节的任意序列,通常表示那些代表人类语言的字符。
最简单的字符串是括在单引号(单引号字符)内。在引号标记内的文本是字符串的值:
'This is a simple Ruby string literal'
如果您需要在单引号字符串内使用单引号字符,那么需要在单引号字符串使用反斜杠,这样 Ruby 解释器就不会认为这个单引号字符会终止字符串:
'Won\'t you read O\'Reilly\'s book?'
反斜杠也能转义另一个反斜杠,这样第二个反斜杠本身不会解释为转义字符。
以下是 Ruby 中字符串相关的特性。
表达式置换
表达式置换是一种使用 #{ 和 } 把任意 Ruby 表达式的值嵌入到字符串中的方式:
#!/usr/bin/ruby
x, y, z = 12, 36, 72
puts "The value of x is #{ x }."
puts "The sum of x and y is #{ x + y }."
puts "The average was #{ (x + y + z)/3 }."
这将产生以下结果:
The value of x is 12.
The sum of x and y is 48.
The average was 40.
一般的分隔字符串
通过一般的分隔字符串,您可以在以百分号字符(%)为前导的一对匹配的任意分隔字符(例如,!、 (、 {、 <,等等)内创建字符串。Q、 q 和 x 有特殊的意义。一般的分隔字符串可以是:
%{Ruby is fun.} 相当于 "Ruby is fun."
%Q{ Ruby is fun. } 相当于 " Ruby is fun. "
%q[Ruby is fun.] 相当于以单引号字符串
%x!ls! 相当于反勾号命令输出 `ls`
转义字符
下标列出了可使用反斜杠符号转义的转义字符或非打印字符。
注意:在一个双引号括起的字符串内,转义字符会被解释;在一个单引号括起的字符串内,转义字符会被保留。
反斜杠符号十六进制字符描述
\a0x07报警符
\b0x08退格键
\cx Control-x
\C-x Control-x
\e0x1b转义符
\f0x0c换页符
\M-\C-x Meta-Control-x
\n0x0a换行符
\nnn 八进制表示法,其中 n 的范围为 0.7
\r0x0d回车符
\s0x20空格符
\t0x09制表符
\v0x0b垂直制表符
\x 字符 x
\xnn 十六进制表示法,其中 n 的范围为 0.9、 a.f 或 A.F
字符编码
Ruby 的默认字符集是 ASCII,字符可用单个字节表示。如果您使用 UTF-8 或其他现代的字符集,字符可能是用一个到四个字节表示。
您可以在程序开头使用 $KCODE 改变字符集,如下所示:
$KCODE = 'u'
下面是 $KCODE 可能的值。
编码描述
aASCII (与 none 相同)。这是默认的。
eEUC。
nNone (与 ASCII 相同)。
uUTF-8。
字符串内建方法
我们需要有一个 String 对象的实例来调用 String 方法。下面是创建 String 对象实例的方式:
new [String.new(str="")]
这将返回一个包含 str 副本的新的字符串对象。现在,使用 str 对象,我们可以调用任意可用的实例方法。例如:
#!/usr/bin/ruby
myStr = String.new("THIS IS TEST")
foo = myStr.downcase
puts "#{foo}"
这将产生以下结果:
this is test
下面是公共的字符串方法(假设 str 是一个 String 对象):
序号方法 & 描述
1str % arg
使用格式规范格式化字符串。如果 arg 包含一个以上的替代,那么 arg 必须是一个数组。如需了解更多格式规范的信息,请查看"内核模块"下的 sprintf。
2str * integer
返回一个包含 integer 个 str 的新的字符串。换句话说,str 被重复了 integer 次。
3str + other_str
连接 other_str 到 str。
4str << obj
连接一个对象到字符串。如果对象是范围为 0.255 之间的固定数字 Fixnum,则它会被转换为一个字符。把它与 concat 进行比较。
5str <=> other_str
把 str 与 other_str 进行比较,返回 -1(小于)、0(等于)或 1(大于)。比较是区分大小写的。
6str == obj
检查 str 和 obj 的相等性。如果 obj 不是字符串,则返回 false,如果 str <=> obj,则返回 true,返回 0。
7str =~ obj
根据正则表达式模式 obj 匹配 str。返回匹配开始的位置,否则返回 false。
8str =~ obj
根据正则表达式模式 obj 匹配 str。返回匹配开始的位置,否则返回 false。
9str.capitalize
把字符串转换为大写字母显示。
10str.capitalize!
与 capitalize 相同,但是 str 会发生变化并返回。
11str.casecmp
不区分大小写的字符串比较。
12str.center
居中字符串。
13str.chomp
从字符串末尾移除记录分隔符($/),通常是 \n。如果没有记录分隔符,则不进行任何操作。
14str.chomp!
与 chomp 相同,但是 str 会发生变化并返回。
15str.chop
移除 str 中的最后一个字符。
16str.chop!
与 chop 相同,但是 str 会发生变化并返回。
17str.concat(other_str)
连接 other_str 到 str。
18str.count(str, ...)
给一个或多个字符集计数。如果有多个字符集,则给这些集合的交集计数。
19str.crypt(other_str)
对 str 应用单向加密哈希。参数是两个字符长的字符串,每个字符的范围为 a.z、 A.Z、 0.9、 . 或 /。
20str.delete(other_str, ...)
返回 str 的副本,参数交集中的所有字符会被删除。
21str.delete!(other_str, ...)
与 delete 相同,但是 str 会发生变化并返回。
22str.downcase
返回 str 的副本,所有的大写字母会被替换为小写字母。
23str.downcase!
与 downcase 相同,但是 str 会发生变化并返回。
24str.dump
返回 str 的版本,所有的非打印字符被替换为 \nnn 符号,所有的特殊字符被转义。
25str.each(separator=$/) { |substr| block }
使用参数作为记录分隔符(默认是 $/)分隔 str,传递每个子字符串给被提供的块。
26str.each_byte { |fixnum| block }
传递 str 的每个字节给 block,以字节的十进制表示法返回每个字节。
27str.each_line(separator=$/) { |substr| block }
使用参数作为记录分隔符(默认是 $/)分隔 str,传递每个子字符串给被提供的 block。
28str.empty?
如果 str 为空(即长度为 0),则返回 true。
29str.eql?(other)
如果两个字符串有先攻的长度和内容,则这两个字符串相等。
30str.gsub(pattern, replacement) [or]
str.gsub(pattern) { |match| block }
返回 str 的副本,pattern 的所有出现都替换为 replacement 或 block 的值。pattern 通常是一个正则表达式 Regexp;如果是一个字符串 String,则没有正则表达式元字符被解释(即,/\d/ 将匹配一个数字,但 '\d' 将匹配一个反斜杠后跟一个 'd')。
31str[fixnum] [or] str[fixnum,fixnum] [or] str[range] [or] str[regexp] [or] str[regexp, fixnum] [or] str[other_str]
使用下列的参数引用 str:参数为一个 Fixnum,则返回 fixnum 的字符编码;参数为两个 Fixnum,则返回一个从偏移(第一个 fixnum)开始截至到长度(第二个 fixnum)为止的子字符串;参数为 range,则返回该范围内的一个子字符串;参数为 regexp,则返回匹配字符串的部分;参数为带有 fixnum 的 regexp,则返回 fixnum 位置的匹配数据;参数为 other_str,则返回匹配 other_str 的子字符串。一个负数的 Fixnum 从字符串的末尾 -1 开始。
32str[fixnum] = fixnum [or] str[fixnum] = new_str [or] str[fixnum, fixnum] = new_str [or] str[range] = aString [or] str[regexp] =new_str [or] str[regexp, fixnum] =new_str [or] str[other_str] = new_str ]
替换整个字符串或部分字符串。与 slice! 同义。
33str.gsub!(pattern, replacement) [or] str.gsub!(pattern) { |match| block }
执行 String#gsub 的替换,返回 str,如果没有替换被执行则返回 nil。
34str.hash
返回一个基于字符串长度和内容的哈希。
35str.hex
把 str 的前导字符当作十六进制数字的字符串(一个可选的符号和一个可选的 0x),并返回相对应的数字。如果错误则返回零。
36str.include? other_str [or] str.include? fixnum
如果 str 包含给定的字符串或字符,则返回 true。
37str.index(substring [, offset]) [or]
str.index(fixnum [, offset]) [or]
str.index(regexp [, offset])
返回给定子字符串、字符(fixnum)或模式(regexp)在 str 中第一次出现的索引。如果未找到则返回 nil。如果提供了第二个参数,则指定在字符串中开始搜索的位置。
38str.insert(index, other_str)
在给定索引的字符前插入 other_str,修改 str。负值索引从字符串的末尾开始计数,并在给定字符后插入。其意图是在给定的索引处开始插入一个字符串。
39str.inspect
返回 str 的可打印版本,带有转义的特殊字符。
40str.intern [or] str.to_sym
返回与 str 相对应的符号,如果之前不存在,则创建符号。
41str.length
返回 str 的长度。把它与 size 进行比较。
42str.ljust(integer, padstr=' ')
如果 integer 大于 str 的长度,则返回长度为 integer 的新字符串,新字符串以 str 左对齐,并以 padstr 作为填充。否则,返回 str。
43str.lstrip
返回 str 的副本,移除了前导的空格。
44str.lstrip!
从 str 中移除前导的空格,如果没有变化则返回 nil。
45str.match(pattern)
如果 pattern 不是正则表达是,则把 pattern 转换为正则表达式 Regexp,然后在 str 上调用它的匹配方法。
46str.oct
把 str 的前导字符当作十进制数字的字符串(一个可选的符号),并返回相对应的数字。如果转换失败,则返回 0。
47str.replace(other_str)
把 str 中的内容替换为 other_str 中的相对应的值。
48str.reverse
返回一个新字符串,新字符串是 str 的倒序。
49str.reverse!
逆转 str,str 会发生变化并返回。
50str.rindex(substring [, fixnum]) [or]
str.rindex(fixnum [, fixnum]) [or]
str.rindex(regexp [, fixnum])
返回给定子字符串、字符(fixnum)或模式(regexp)在 str 中最后一次出现的索引。如果未找到则返回 nil。如果提供了第二个参数,则指定在字符串中结束搜索的位置。超出该点的字符将不被考虑。
51str.rjust(integer, padstr=' ')
如果 integer 大于 str 的长度,则返回长度为 integer 的新字符串,新字符串以 str 右对齐,并以 padstr 作为填充。否则,返回 str。
52str.rstrip
返回 str 的副本,移除了尾随的空格。
53str.rstrip!
从 str 中移除尾随的空格,如果没有变化则返回 nil。
54str.scan(pattern) [or]
str.scan(pattern) { |match, ...| block }
两种形式匹配 pattern(可以是一个正则表达式 Regexp 或一个字符串 String)遍历 str。针对每个匹配,会生成一个结果,结果会添加到结果数组中或传递给 block。如果 pattern 不包含分组,则每个独立的结果由匹配的字符串、$& 组成。如果 pattern 包含分组,每个独立的结果是一个包含每个分组入口的数组。
55str.slice(fixnum) [or] str.slice(fixnum, fixnum) [or]
str.slice(range) [or] str.slice(regexp) [or]
str.slice(regexp, fixnum) [or] str.slice(other_str)
See str[fixnum], etc.
str.slice!(fixnum) [or] str.slice!(fixnum, fixnum) [or] str.slice!(range) [or] str.slice!(regexp) [or] str.slice!(other_str)
从 str 中删除指定的部分,并返回删除的部分。如果值超出范围,参数带有 Fixnum 的形式,将生成一个 IndexError。参数为 range 的形式,将生成一个 RangeError,参数为 Regexp 和 String 的形式,将忽略执行动作。
56str.split(pattern=$;, [limit])
基于分隔符,把 str 分成子字符串,并返回这些子字符串的数组。
如果 pattern 是一个字符串 String,那么在分割 str 时,它将作为分隔符使用。如果 pattern 是一个单一的空格,那么 str 是基于空格进行分割,会忽略前导空格和连续空格字符。
如果 pattern 是一个正则表达式 Regexp,则 str 在 pattern 匹配的地方被分割。当 pattern 匹配一个玲长度的字符串时,str 被分割成单个字符。
如果省略了 pattern 参数,则使用 $; 的值。如果 $; 为 nil(默认的),str 基于空格进行分割,就像是指定了 ` ` 作为分隔符一样。
如果省略了 limit 参数,会抑制尾随的 null 字段。如果 limit 是一个正数,则最多返回该数量的字段(如果 limit 为 1,则返回整个字符串作为数组中的唯一入口)。如果 limit 是一个负数,则返回的字段数量不限制,且不抑制尾随的 null 字段。
57str.squeeze([other_str]*)
使用为 String#count 描述的程序从 other_str 参数建立一系列字符。返回一个新的字符串,其中集合中出现的相同的字符会被替换为单个字符。如果没有给出参数,则所有相同的字符都被替换为单个字符。
58str.squeeze!([other_str]*)
与 squeeze 相同,但是 str 会发生变化并返回,如果没有变化则返回 nil。
59str.strip
返回 str 的副本,移除了前导的空格和尾随的空格。
60str.strip!
从 str 中移除前导的空格和尾随的空格,如果没有变化则返回 nil。
61str.sub(pattern, replacement) [or]
str.sub(pattern) { |match| block }
返回 str 的副本,pattern 的第一次出现会被替换为 replacement 或 block 的值。pattern 通常是一个正则表达式 Regexp;如果是一个字符串 String,则没有正则表达式元字符被解释。
62str.sub!(pattern, replacement) [or]
str.sub!(pattern) { |match| block }
执行 String#sub 替换,并返回 str,如果没有替换执行,则返回 nil。
63str.succ [or] str.next
返回 str 的继承。
64str.succ! [or] str.next!
相当于 String#succ,但是 str 会发生变化并返回。
65str.sum(n=16)
返回 str 中字符的 n-bit 校验和,其中 n 是可选的 Fixnum 参数,默认为 16。结果是简单地把 str 中每个字符的二进制值的总和,以 2n - 1 为模。这不是一个特别好的校验和。
66str.swapcase
返回 str 的副本,所有的大写字母转换为小写字母,所有的小写字母转换为大写字母。
67str.swapcase!
相当于 String#swapcase,但是 str 会发生变化并返回,如果没有变化则返回 nil。
68str.to_f
返回把 str 中的前导字符解释为浮点数的结果。超出有效数字的末尾的多余字符会被忽略。如果在 str 的开头没有有效数字,则返回 0.0。该方法不会生成异常。
69str.to_i(base=10)
返回把 str 中的前导字符解释为整数基数(基数为 2、 8、 10 或 16)的结果。超出有效数字的末尾的多余字符会被忽略。如果在 str 的开头没有有效数字,则返回 0。该方法不会生成异常。
70str.to_s [or] str.to_str
返回接收的值。
71str.tr(from_str, to_str)
返回 str 的副本,把 from_str 中的字符替换为 to_str 中相对应的字符。如果 to_str 比 from_str 短,那么它会以最后一个字符进行填充。两个字符串都可以使用 c1.c2 符号表示字符的范围。如果 from_str 以 ^ 开头,则表示除了所列出的字符以外的所有字符。
72str.tr!(from_str, to_str)
相当于 String#tr,但是 str 会发生变化并返回,如果没有变化则返回 nil。
73str.tr_s(from_str, to_str)
把 str 按照 String#tr 描述的规则进行处理,然后移除会影响翻译的重复字符。
74str.tr_s!(from_str, to_str)
相当于 String#tr_s,但是 str 会发生变化并返回,如果没有变化则返回 nil。
75str.unpack(format)
根据 format 字符串解码 str(可能包含二进制数据),返回被提取的每个值的数组。format 字符由一系列单字符指令组成。每个指令后可以跟着一个数字,表示重复该指令的次数。星号(*)将使用所有剩余的元素。指令 sSiIlL 每个后可能都跟着一个下划线(_),为指定类型使用底层平台的本地尺寸大小,否则使用独立于平台的一致的尺寸大小。format 字符串中的空格会被忽略。
76str.upcase
返回 str 的副本,所有的小写字母会被替换为大写字母。操作是环境不敏感的,只有字符 a 到 z 会受影响。
77str.upcase!
改变 str 的内容为大写,如果没有变化则返回 nil。
78str.upto(other_str) { |s| block }
遍历连续值,以 str 开始,以 other_str 结束(包含),轮流传递每个值给 block。String#succ 方法用于生成每个值。
字符串 unpack 指令
下表列出了方法 String#unpack 的解压指令。
指令返回描述
AString移除尾随的 null 和空格。
aString字符串。
BString从每个字符中提取位(首先是最高有效位)。
bString从每个字符中提取位(首先是最低有效位)。
CFixnum提取一个字符作为无符号整数。
cFixnum提取一个字符作为整数。
D, dFloat把 sizeof(double) 长度的字符当作原生的 double。
EFloat把 sizeof(double) 长度的字符当作 littleendian 字节顺序的 double。
eFloat把 sizeof(float) 长度的字符当作 littleendian 字节顺序的 float。
F, fFloat把 sizeof(float) 长度的字符当作原生的 float。
GFloat把 sizeof(double) 长度的字符当作 network 字节顺序的 double。
gFloat把 sizeof(float) 长度的字符当作 network 字节顺序的 float。
HString从每个字符中提取十六进制(首先是最高有效位)。
hString从每个字符中提取十六进制(首先是最低有效位)。
IInteger把 sizeof(int) 长度(通过 _ 修改)的连续字符当作原生的 integer。
iInteger把 sizeof(int) 长度(通过 _ 修改)的连续字符当作有符号的原生的 integer。
LInteger把四个(通过 _ 修改)连续字符当作无符号的原生的 long integer。
lInteger把四个(通过 _ 修改)连续字符当作有符号的原生的 long integer。
MString引用可打印的。
mStringBase64 编码。
NInteger把四个字符当作 network 字节顺序的无符号的 long。
nFixnum把两个字符当作 network 字节顺序的无符号的 short。
PString把 sizeof(char *) 长度的字符当作指针,并从引用的位置返回 \emph{len} 字符。
pString把 sizeof(char *) 长度的字符当作一个空结束字符的指针。
QInteger把八个字符当作无符号的 quad word(64 位)。
qInteger把八个字符当作有符号的 quad word(64 位)。
SFixnum把两个(如果使用 _ 则不同)连续字符当作 native 字节顺序的无符号的 short。
sFixnum把两个(如果使用 _ 则不同)连续字符当作 native 字节顺序的有符号的 short。
UIntegerUTF-8 字符,作为无符号整数。
uStringUU 编码。
VFixnum把四个字符当作 little-endian 字节顺序的无符号的 long。
vFixnum把两个字符当作 little-endian 字节顺序的无符号的 short。
wIntegerBER 压缩的整数。
X 向后跳过一个字符。
x 向前跳过一个字符。
ZString和 * 一起使用,移除尾随的 null 直到第一个 null。
@ 跳过 length 参数给定的偏移量。
实例
尝试下面的实例,解压各种数据。
"abc \0\0abc \0\0".unpack('A6Z6') #=> ["abc", "abc "]
"abc \0\0".unpack('a3a3') #=> ["abc", " \000\000"]
"abc \0abc \0".unpack('Z*Z*') #=> ["abc ", "abc "]
"aa".unpack('b8B8') #=> ["10000110", "01100001"]
"aaa".unpack('h2H2c') #=> ["16", "61", 97]
"\xfe\xff\xfe\xff".unpack('sS') #=> [-2, 65534]
"now=20is".unpack('M*') #=> ["now is"]
"whole".unpack('xax2aX2aX1aX2a') #=> ["h", "e", "l", "l", "o"]
(编辑:雷林鹏 来源:网络)
雷林鹏分享:Ruby 字符串(String)的更多相关文章
- 雷林鹏分享:Ruby 循环
Ruby 循环 Ruby 中的循环用于执行相同的代码块若干次.本章节将详细介绍 Ruby 支持的所有循环语句. Ruby while 语句 语法 while conditional [do] code ...
- 雷林鹏分享:Ruby 数据类型
Ruby 数据类型 本章节我们将为大家介绍 Ruby 的基本数据类型. Ruby支持的数据类型包括基本的Number.String.Ranges.Symbols,以及true.false和nil这几个 ...
- 雷林鹏分享:C# 字符串(String)
C# 字符串(String) 在 C# 中,您可以使用字符数组来表示字符串,但是,更常见的做法是使用 string 关键字来声明一个字符串变量.string 关键字是 System.String 类的 ...
- 雷林鹏分享:Ruby 语法
Ruby 语法 让我们编写一个简单的 Ruby 程序.所有的 Ruby 文件扩展名都是 .rb.所以,把下面的源代码放在 test.rb 文件中. #!/usr/bin/ruby -w puts &q ...
- 雷林鹏分享:Ruby 数组(Array)
Ruby 数组(Array) Ruby 数组是任何对象的有序的.整数索引的集合.数组中的每个元素都与一个索引相关,并可通过索引进行获取. 数组的索引从 0 开始,这与 C 或 Java 中一样.一个负 ...
- 雷林鹏分享:Ruby 面向对象
Ruby 面向对象 Ruby 是纯面向对象的语言,Ruby 中的一切都是以对象的形式出现.Ruby 中的每个值都是一个对象,即使是最原始的东西:字符串.数字,甚至连 true 和 false 都是对象 ...
- 雷林鹏分享:Ruby 异常
Ruby 异常 异常和执行总是被联系在一起.如果您打开一个不存在的文件,且没有恰当地处理这种情况,那么您的程序则被认为是低质量的. 如果异常发生,则程序停止.异常用于处理各种类型的错误,这些错误可能在 ...
- 雷林鹏分享:Ruby 数据库访问 - DBI 教程
Ruby 数据库访问 - DBI 教程 本章节将向您讲解如何使用 Ruby 访问数据库.Ruby DBI 模块为 Ruby 脚本提供了类似于 Perl DBI 模块的独立于数据库的接口. DBI 即 ...
- 雷林鹏分享:Ruby CGI方法
Ruby CGI方法 以下为CGI类的方法列表: 序号方法描述 1CGI::new([ level="query"]) 创建 CGI 对象.query可以是以下值: query: ...
随机推荐
- codeforces D - Arthur and Walls
这题说的是给了一个矩阵,必须让.连接起来的图形变成矩形,2000*2000的矩形,那么我们就可以知道了,只要是存在一个有点的区域应该尽量将他削为矩形,那么将这个图形进行缩放,最后我们知道只要存在一个2 ...
- git参考文档
==================================================================================================== ...
- Filter过滤器原理和登录实现
Filter过滤器API Servlet过滤器API包含了3个接口,它们都在javax.servlet包中,分别是Filter接口.FilterChain接口和FilterConfig接口. ...
- mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)字符串拼接cancat实战例子
mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)mysql字符串拼接cancat实战例子: mysql update set 多个字段相加,如果是数字相加可以直接用+号(注:hund ...
- windows下nodejs express安装及入门网站,视频资料,开源项目介绍
windows下nodejs express安装及入门网站,视频资料,开源项目介绍,pm2,supervisor,npm,Pomelo,Grunt安装使用注意事项等总结 第一步:下载安装文件下载地址: ...
- C/C++之面向对象
面向对象的三个基本特征(讲解) 面向对象的三个基本特征是:封装.继承.多态. 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可 ...
- appium— Android定位webView里面的UI元素
Android SDK中的UIAutomator中本身是不支持网页中的UI元素定位,下面介绍几种常用的定位app内部的网页的UI元素的方法. 一.使用chrome浏览器调试移动端网页 这是使用最多的一 ...
- MyEclipse2014+JDK1.7+Tomcat8.0+Maven3.2 开发环境搭建
1.JDK的安装 首先下载JDK,这个从sun公司官网可以下载,根据自己的系统选择64位还是32位,安装过程就是next一路到底.安装完成之后当然要配置环境变量了. ————————————————— ...
- Java高并发高性能分布式框架从无到有微服务架构设计
微服务架构模式(Microservice Architect Pattern).近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注 微服务架构是一种架构模式,它提倡将单一应用程序划分成 ...
- 各种语言中的可变参数(java、python、c++、javascript)
索引: java python c++ js 1.Java public class Animal { // 接受可变参数的方法 void eat(String... Objects) { for ( ...