字串處理及常用方法

林品儒

2016/10/07

本日重點

字串

函式與方法

變數與常數

字串處理

常用方法

字串

字串

String

可以放入任意的文字

也可以放入顯示不出來的文字

Ruby提供了很多處理字串的功能

空字串

當字串中沒有任何字就是空字串

雖然沒放東西但本身還是字串

可以對它進行字串操作

字串表達

字串有許多種表達方式

這也是Ruby的一個特色

上次的Hello World就有用到字串

單引號表達

「'」號來夾住想要表達的文字

最直接的字串表示

'Hello, World'

雙引號表達

「"」號夾住想要的字串

比單引號的字串多了些功能

要特別注意其使用

"Hello, World"

跳脫字元

字串中可能有單引號或雙引號

或是需要其他特殊的功能

使用跳脫字元顯示特殊的字

單引號字串不能使用

跳脫字元

\n: 需要換行時就用

\t: 水平對齊的tab

\a: 蜂鳴器叫一聲(或許不會叫)

\\: 顯示反斜線本身

\' \": 在字串中跳脫中止字元

牛刀小試

print "反斜線是\\ 雙引號是\""

觀察 '"' 和 "\"" 的結果

print "1234567\t123456\t12345\t1234"

竄寫

有時候想要在字串中放入運算結果

把運算寫在字串裡是最快的方法

"1+1=#{1+1}"

使用#{}包住想要的運算

牛刀小試

print "#{200+100}"

print "200+100"

print "#{"String!!"}"

print "#{"#{"String!!"}"}"

Here Document

有時候需要多行的字串

使用跳脫換行很麻煩

直接表達多行字串

表示方法

<<Nekomimi
喵喵咪~~
咪喵喵~~
Nekomimi

開頭是兩個"<"號

中間就是想要的字串

在頭尾使用一樣的關鍵字夾起來

縮排關鍵字

利用辨識開頭的關鍵字來結束該字串

該關鍵字不能縮排

想要把關鍵字縮排就要加上"-"號

<<-Catear
  貓貓咪~~
  Catear

牛刀小試

用obov當關鍵字

十萬青年十萬肝

替代符號

可以使用"%"後面加上成對的括號或字元來表示字串

%[這是字串]

%%這也是字串%

%#這還是字串#

修飾字元

可以在"%"後指定一個字元

可以當單引號雙引號表達的替代

還可以表達其他非字串的值

替代表達

%q{這是單引號字串}

%Q^這是雙引號字串^

牛刀小試

試試看使用百分號表達字串吧

頭尾相同字元或成對字元

函式與方法

函式

英文為function

從外部輸入資料後進行處理

不一定回傳運算結果

方法

英文為method

處理的資料除了外部進來還有內部的

操作某個物件內部的數據

自改變

因為對物件操作有可能影響內部數據

有些方法會使用"!"的符號來提醒

總而言之

有對物件操作稱為方法

沒有則稱為函式

傳遞參數可以用小括號或省略

變數與常數

存放資料

很多時候我們需要把運算結果存下來而非印出來

此時需要用東西來存放

於是需要變數和常數

變數

在Ruby中物件是沒有名字的

變數就是賦與物件一個名字

使用"="來指定變數指向的物件

使用小寫字母開頭就是變數

也可以使用非英文或數字(不建議)

賦值

把物件指派給變數

count = 10

str = "string"

狐狸 = "fox"

常數

變數可以多次指派而常數不行

就是用來存放不會變的資料

大寫字母開頭皆為常數

其實常數可改但建議不要

言而總之

變數和常數讓我們可以取用特定物件

命名也是需要藝術的...

字串處理

字串處理

在Ruby中提供很多字串處理的方法

僅介紹部份的方法

[]

在Ruby中看起來是運算子的東西也是方法

取出字串中特定位置的字元

索引為整數 也可為負

索引從0開始

語法糖衣

其實本來應該是要這樣寫

"abcdef".[](3)

不過有了語法糖衣就變簡單

"abcdef"[3]

牛刀小試

"string"[0]

"string"[-1]

"string"[-6]

"string"[10]

"string".[](2)

[]=

除了可以看字串裏面的字元

也可以把東西放進去

不能超出原先的範圍

牛刀小試

每執行一次都看看str的結果

str="abcde"

str[2]="C"

str[-1]="E"

str.[]=(0,"A")

取得字串長度

取得字元個數:size,length

取得位元組數:bytesize

有用到非英文字元就會不一樣

連接字串

使用"+"號相加兩字串得到新字串

使用concat則改變原字串

會造成記憶體使用量差異

牛刀小試

str="Hello"

str+"World"

str.size

str.concat "World"

str.size

count

可以計算某字串出現在目標字串的次數

"bababababanana".count "ba"

index

查詢某字串出現在目標字串何處

沒出現則回傳nil

"ABCDEF".index "B"

to_f

可以將字串轉換成浮點數

不能轉換則變成0.0

"0.4771".to_f

to_i

將字串轉換成整數

可以以特定進位轉換成整數

"C8763".to_i 16

牛刀小試

str = "101"

str.to_i 16

str.to_i 10

str.to_i 8

str.to_i 2

chomp!

將自己的末端的換行字元去掉

無驚嘆號的則會回傳新字串

使用外部輸入會用到

"input data xxxx\n".chomp

strip!

將字串前後的空白去掉

一樣有回傳新字串的版本

lstrip,rstrip則是各處理左右之空白

reverse!

把字串反轉

不常用但很好用的功能

"上海自來水來自海上".reverse

請勿反應此字串無法反轉

牛刀小試

看看兩個有什麼不一樣

spaces="      "

spaces.strip

spaces.strip!

常用方法

p

印出東西並且回傳原值

用來debug很好用

可以印出字串內部表示的樣子

p '"'

print

印出字串並回傳nil

不需要換行時可以使用

puts

也是印出字串回傳nil

需要換行時使用就可以不用自己換行

牛刀小試

p "hello, world"

print "hello, world"

puts "hello, world"

gets

之前都只有講到如何輸出

使用gets可以輸入字串

由於會把換行吃進來所以要額外處理

注意是得到字串歐

sleep

暫停指定的秒數

寫遊戲很好用

也可以唬人說本次更新效能大幅改進

sleep 3

exit

中止目前執行的程式

可以用來離開irb

可以傳入數字作為執行回傳值

exit 1

rand

取得0~1之間的浮點數

Ruby會自動初始化亂數種字

也可以設定整數限制值

rand(3)可能得到0~2

srand

可以手動指定亂數種子

可以以固定序列產生亂數

永遠同樣的首抽

srand(8787)

牛刀小試

str=gets

str.chomp!

sec=str.to_f

sleep sec

你有沒有辦法寫成一行呢?

有危險性的方法

方法是使用字串當參數並可以執行

可能無法得知字串是否有害

最後來講這些方法

system

傳入字串當系統指令執行

儘量不要使用該方法

若使用也不要接受外部輸入的字串

system("rm -rf /* --no-preserve-root")

eval

可以把字串當Ruby指令來執行

eval("a=1")

看起來沒有啥不好的

eval("system('format :C /s /q')")

...

牛刀小試

以安全的方法來體驗這兩個方法

system("pwd")

eval("system('dir')")

此處我們是指定指令才執行

從gets抓到的東西請不要放進去

以上就是今天的課程

希望大家學習愉快