Latest web development tutorials

Rubyの正規表現

正規表現は特別な構文パターンを使用して一致するか文字列のコレクションを見つけるための特別な文字シーケンスです。

正規表現は、特定の文字の事前定義された組み合わせ、およびこれらの特定の文字数を使用している、「文字列のルール」、「ルール文字列は「文字列のフィルタリングロジックを表現するために使用されて形成されます。

文法

次のように正規表現は 、文字通り、間の任意の区切り文字%rのモードの後の間のどこかにスラッシュ、または:

/pattern/
/pattern/im    # 可以指定选项
%r!/usr/local! # 使用分隔符的正则表达式

#!/usr/bin/ruby

line1 = "Cats are smarter than dogs";
line2 = "Dogs also like meat";

if ( line1 =~ /Cats(.*)/ )
  puts "Line1 contains Cats"
end
if ( line2 =~ /Cats(.*)/ )
  puts "Line2 contains  Dogs"
end

上の例の出力は実行します。

Line1 contains Cats

正規表現の修飾子

正規表現は、文字通り試合のさまざまな側面を制御するためのオプションの修飾子が含まれていてもよいです。 第スラッシュ指定後修飾剤、上記の例に示すように。 インデックスは、可能な修飾子を示しています。

修飾子 説明
テキストに一致する場合を無視します。
O 彼は判断された最初の時間は、一度だけ#{}補間、正規表現を行いました。
X 式全体に空白やコメントで許可のスペースを無視します。
メートル 複数行のマッチング、改行文字は通常の文字として認識しました。
U、E、S、N 正規表現は、Unicode(UTF-8)、EUC、SJISまたはASCIIとして解釈されます。 修飾子は、ソースコードを使用した正規表現と見なされていない場合。

%Qと同様で区切られた文字列と同じように、Rubyはあなたが任意の区切り文字に続いて、正規表現の先頭に%rにできます。 あなたはスラッシュ文字をエスケープしたくない場合は、この説明は非常に便利なのが多数含まれています。

# 下面匹配单个斜杠字符,不转义
%r|/|               

# Flag 字符可通过下面的语法进行匹配
%r[</(.*)>]i  

正規表現パターン

制御文字に加えて、(+ * ^ $() [] {} | \?)、他のすべての文字は、それ自身にマッチ。 あなたは、制御文字をエスケープするには、バックスラッシュを配置する前に文字を制御することができます。

次の表は、使用可能な正規表現の構文はRubyを示しています。

模式描述
^匹配行的开头。
$匹配行的结尾。
.匹配除了换行符以外的任意单字符。使用 m 选项时,它也可以匹配换行符。
[...]匹配在方括号中的任意单字符。
[^...]匹配不在方括号中的任意单字符。
re*匹配前面的子表达式零次或多次。
re+匹配前面的子表达式一次或多次。
re?匹配前面的子表达式零次或一次。
re{ n}匹配前面的子表达式 n 次。
re{ n,}匹配前面的子表达式 n 次或 n 次以上。
re{ n, m}匹配前面的子表达式至少 n 次至多 m 次。
a| b匹配 a 或 b。
(re)对正则表达式进行分组,并记住匹配文本。
(?imx)暂时打开正则表达式内的 i、 m 或 x 选项。如果在圆括号中,则只影响圆括号内的部分。
(?-imx)暂时关闭正则表达式内的 i、 m 或 x 选项。如果在圆括号中,则只影响圆括号内的部分。
(?: re)对正则表达式进行分组,但不记住匹配文本。
(?imx: re)暂时打开圆括号内的 i、 m 或 x 选项。
(?-imx: re)暂时关闭圆括号内的 i、 m 或 x 选项。
(?#...)注释。
(?= re)使用模式指定位置。没有范围。
(?! re)使用模式的否定指定位置。没有范围。
(?> re)匹配无回溯的独立模式。
\w匹配单词字符。
\W匹配非单词字符。
\s匹配空白字符。等价于 [\t\n\r\f]。
\S匹配非空白字符。
\d匹配数字。等价于 [0-9]。
\D匹配非数字。
\A匹配字符串的开头。
\Z匹配字符串的结尾。如果存在换行符,则只匹配到换行符之前。
\z匹配字符串的结尾。
\G匹配最后一个匹配完成的点。
\b当在括号外时匹配单词边界,当在括号内时匹配退格键(0x08)。
\B匹配非单词边界。
\n, \t, etc.匹配换行符、回车符、制表符,等等。
\1...\9匹配第 n 个分组子表达式。
\10如果已匹配过,则匹配第 n 个分组子表达式。否则指向字符编码的八进制表示。

正規表現の例

文字

説明
/ルビー/ マッチ "ルビー"
¥ 円記号が一致します。 Ruby 1.9のとRuby 1.8は、複数の文字をサポートしています。

文字クラス

实例描述
/[Rr]uby/ 匹配 "Ruby" 或 "ruby"
/rub[ye]/ 匹配 "ruby" 或 "rube"
/[aeiou]/匹配任何一个小写元音字母
/[0-9]/ 匹配任何一个数字,与 /[0123456789]/ 相同
/[a-z]/匹配任何一个小写 ASCII 字母
/[A-Z]/匹配任何一个大写 ASCII 字母
/[a-zA-Z0-9]/匹配任何一个括号内的字符
/[^aeiou]/ 匹配任何一个非小写元音字母的字符
/[^0-9]/匹配任何一个非数字字符

特殊文字クラス

实例描述
/./ 匹配除了换行符以外的其他任意字符
/./m 在多行模式下,也能匹配换行符
/\d/匹配一个数字,等同于 /[0-9]/
/\D/ 匹配一个非数字,等同于 /[^0-9]/
/\s/匹配一个空白字符,等同于 /[ \t\r\n\f]/
/\S/ 匹配一个非空白字符,等同于 /[^ \t\r\n\f]/
/\w/ 匹配一个单词字符,等同于 /[A-Za-z0-9_]/
/\W/匹配一个非单词字符,等同于 /[^A-Za-z0-9_]/

リピート

实例描述
/ruby?/ 匹配 "rub" 或 "ruby"。其中,y 是可有可无的。
/ruby*/ 匹配 "rub" 加上 0 个或多个的 y。
/ruby+/匹配 "rub" 加上 1 个或多个的 y。
/\d{3}/刚好匹配 3 个数字。
/\d{3,}/匹配 3 个或多个数字。
/\d{3,5}/匹配 3 个、4 个或 5 个数字。

非貪欲リピート

これは、繰り返しの最小数と一致します。

实例描述
/<.*>/贪婪重复:匹配 "<ruby>perl>"
/<.*?>/ 非贪婪重复:匹配 "<ruby>perl>" 中的 "<ruby>"

括弧でグループ化されました

实例描述
/\D\d+/ 无分组: + 重复 \d
/(\D\d)+/ 分组: + 重复 \D\d 对
/([Rr]uby(, )?)+/匹配 "Ruby"、"Ruby, ruby, ruby",等等

後方参照

試合前に、この試合は、再びグループ化されていました。

实例描述
/([Rr])uby&\1ails/匹配 ruby&rails 或 Ruby&Rails
/(['"])(?:(?!\1).)*\1/单引号或双引号字符串。\1 匹配第一个分组所匹配的字符,\2 匹配第二个分组所匹配的字符,依此类推。

交換します

实例描述
/ruby|rube/匹配 "ruby" 或 "rube"
/rub(y|le))/匹配 "ruby" 或 "ruble"
/ruby(!+|\?)/ "ruby" 后跟一个或多个 ! 或者跟一个 ?

アンカー

これは、指定した場所と一致する必要があります。

实例描述
/^Ruby/匹配以 "Ruby" 开头的字符串或行
/Ruby$/ 匹配以 "Ruby" 结尾的字符串或行
/\ARuby/ 匹配以 "Ruby" 开头的字符串
/Ruby\Z/匹配以 "Ruby" 结尾的字符串
/\bRuby\b/匹配单词边界的 "Ruby"
/\brub\B/\B 是非单词边界:匹配 "rube" 和 "ruby" 中的 "rub",但不匹配单独的 "rub"
/Ruby(?=!)/如果 "Ruby" 后跟着一个感叹号,则匹配 "Ruby"
/Ruby(?!!)/ 如果 "Ruby" 后没有跟着一个感叹号,则匹配 "Ruby"

特別な構文をカッコ

实例描述
/R(?#comment)/ 匹配 "R"。所有剩余的字符都是注释。
/R(?i)uby/ 当匹配 "uby" 时不区分大小写。
/R(?i:uby)/ 与上面相同。
/rub(?:y|le))/只分组,不进行 \1 反向引用

検索置換

サブとGSUB置換変数とそのサブ!GSUB正規表現文字列メソッドを使用しているとき重要です。

これらの方法の全ては、検索を実行し、操作を置換する正規表現パターンを使用しています。サブ サブ!発生、GSUBGSUBの最初の置換パターンパターンの出現をすべて置き換えます。

サブとは変更されません元の文字列を残して新しい文字列を返し、 サブ!GSUB!彼らが呼ぶ文字列を変更しGSUB。

次に例を示します。

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

phone = "138-3453-1111 #这是一个电话号码"

# 删除 Ruby 的注释
phone = phone.sub!(/#.*$/, "")   
puts "电话号码 : #{phone}"

# 移除数字以外的其他字符
phone = phone.gsub!(/\D/, "")    
puts "电话号码 : #{phone}"

上の例の出力は実行します。

电话号码 : 138-3453-1111 
电话号码 : 13834531111

別の例を示します。

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

text = "rails 是 rails,  Ruby on Rails 非常好的 Ruby 框架"

# 把所有的 "rails" 改为 "Rails"
text.gsub!("rails", "Rails")

# 把所有的单词 "Rails" 都改成首字母大写
text.gsub!(/\brails\b/, "Rails")

puts "#{text}"

上の例の出力は実行します。

Rails 是 Rails,  Ruby on Rails 非常好的 Ruby 框架