正規表示式之管道符號

2022-08-28 23:30:28 字數 1490 閱讀 9371

今天用ruby寫了以下**並進行了測試:

#正規表示式

line = gets

if line =~ /perl|python/  #如果在字串中匹配了模式,=~返回字串中匹配模式的開始位置

puts "scripting language mentioned: #"

end我認為/perl|python/的意思是匹配"perl"或者匹配"python",但是當字串中既存在"perl"又存在"python"時結果如何呢?

我猜想perl和python誰在前面(指的是在待匹配字串中的順序而非/perl|python/中的順序)就匹配誰,比如"perlpython"就應當匹配perl,"pythonperl"就應當匹配python。

測試結果如下:

#input: pythonperl

#output: scripting language mentioned: pythonperl

#input: perlpython

#output: scripting language mentioned: perlpython

#input: perl455python

#output: scripting language mentioned: perl455python

難道既有perl又有python的時候會進行兩次匹配?!懷著疑問又進行了如下測試:

#input: perl1

#output: scripting language mentioned: perl1

#input: 1perl

#output: scripting language mentioned: 1perl

咦,這是怎麼回事?仔細思考後發現了問題所在,**的第二行如下:

if line =~ /perl|python/  #如果在字串中匹配了模式,=~返回字串中匹配模式的開始位置

這就是我開始犯錯的地方,我認為如果匹配成功,那麼ruby會將匹配的字串返回給line,但實際上:

測試**改版:

line = gets

if line =~ /perl|python/ #匹配perl或者python,兩者其中乙個匹配成功即結束,否則匹配失敗

puts line =~ /perl|python/ #如果在字串中發現了模式,=~返回(也即表示式line =~ /perl|python/的返回值)模式的開始位置

puts "scripting language mentioned: #"#line的值始終為鍵盤輸入的內容,從未改變過

end#input: 1perl

#output:

1scripting language mentioned: 1perl

折騰了半天,以上**並不能測試我想要測試的內容,反而我對 =~ 的理解更加深入了,又或者說我真正明白了上面這段**的意思,也是不亦樂乎~

正規表示式符號

字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...

正規表示式符號

字元描述 將下乙個字元標記為乙個特殊字元 或乙個原義字元 或乙個 向後引用 或乙個八進位制轉義符。例如,n 匹配字元 n n 匹配乙個換行符。序列 匹配 而 則匹配 匹配輸入字串的開始位置。如果設定了 regexp 物件的 multiline 屬性,也匹配 n 或 r 之後的位置。匹配輸入字串的結束...

正規表示式符號

字元 描述 標記下乙個字元是特殊字元或文字。例如,n 和字元 n 匹配。n 則和換行字元匹配。序列 和 匹配,而 則和 匹配。匹配輸入的開頭。匹配輸入的末尾。匹配前乙個字元零或多次。例如,zo 與 z 或 zoo 匹配。匹配前乙個字元一次或多次。例如,zo 與 zoo 匹配,但和 z 不匹配。匹配前...