English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

正则表达式Ruby

正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找字符串集合。

正则表达式用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。

语法

正则表达式从字面上看是一种介于斜杠之间或介于跟在 %r 后的任意分隔符之间的模式,如下所示:

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

Esempio online

#!/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

Esempi di sopra eseguiti risultati di output:

Line1 contains Cats

正则表达式修饰符

正则表达式从字面上看可能包含一个可选的修饰符,用于控制各方面的匹配。修饰符在第二个斜杠字符后指定,如上面示例所示。下标列出了 可能的修饰符:

修饰符描述
i当匹配文本时忽略大小写。
o只执行一次 #{} 插值,正则表达式在第一次时就进行判断。
x忽略空格,允许在整个表达式中放入空白符和注释。
m匹配多行,把换行字符识别为正常字符。
u,e,s,n把正则表达式解释为 Unicode(UTF-8)、EUC、SJIS 或 ASCII。如果没有指定修饰符,则认为正则表达式使用的是源编码。

就像字符串通过 %Q 进行分隔一样,Ruby 允许您以 %r 作为正则表达式的开头,后面跟着任意分隔符。这在描述包含大量您不想转义的斜杠字符时非常有用。

# 下面匹配单个斜杠字符,不转义
%r|/|               
 
# Flag 字符可通过下面的语法进行匹配
%r[</(.*)>]i

正则表达式模式

除了控制字符,(+ ? . * ^ $ ( ) [ ] { } | \),其他所有字符都匹配本身。您可以通过在控制字符前放置一个反斜杠来对控制字符进行转义。

La tabella sottostante elenca la sintassi degli espressioni regolari disponibili in Ruby.

Modello描述
^Corrispondere all'inizio della riga.
$Corrispondere alla fine della riga.
.Corrispondere a qualsiasi singolo carattere non contenuto nel carattere di nuova riga. Utilizzando l'opzione m, può anche corrispondere al carattere di nuova riga.
[...]Corrispondere a qualsiasi singolo carattere contenuto all'interno di parentesi quadre.
[^...]Corrispondere a qualsiasi singolo carattere non contenuto all'interno di parentesi quadre.
re*Corrispondere all'espressione regolare precedente zero volte o più volte.
re+Corrispondere all'espressione regolare precedente una volta o più volte.
re?Corrispondere all'espressione regolare precedente zero volte o una volta.
re{ n}Corrispondere all'espressione regolare precedente n volte.
re{ n,}Corrispondere all'espressione regolare precedente n volte o n volte superiori.
re{ n, m}Corrispondere all'espressione regolare precedente almeno n volte e al massimo m volte.
a| bCorrispondere a a o b.
(re)Raggruppare l'espressione regolare e ricordare il testo della corrispondenza.
(?imx)Aprire temporaneamente le opzioni i, m o x all'interno dell'espressione regolare. Se è nei parentesi, influisce solo sulla parte interna.
(?-imx)Aprire temporaneamente le opzioni i, m o x all'interno dell'espressione regolare. Se è nei parentesi, influisce solo sulla parte interna.
(?: re)Raggruppare l'espressione regolare, ma non ricordare il testo della corrispondenza.
(?imx: re)Aprire temporaneamente le opzioni i, m o x all'interno dei parentesi.
(?-imx: re)Aprire temporaneamente le opzioni i, m o x all'interno dei parentesi.
(?#...)Commento.
(?= re)Specificare la posizione del modello. Senza intervallo.
(?! re)Specificare la posizione negativa del modello. Senza intervallo.
(?> re)Corrispondere a modello indipendente senza ritorno.
\wCorrispondere a character of parola.
\WCorrispondere a non-character of parola.
\sCorrispondere a character space. Equivalente a [\t\n\r\f].
\SCorrispondere a non-character space.
\dCorrispondere a digit. Equivalente a [0-9].
\DCorrispondere a non-digit.
\ACorrispondere all'inizio della stringa.
\ZCorrispondere alla fine della stringa. Se esiste un carattere di nuova riga, corrispondere solo alla fine del carattere di nuova riga.
\zCorrispondere alla fine della stringa.
\GCorrispondere all'ultimo punto corrispondente completato.
\bCorrispondere al boundary di parola quando è fuori dai parentesi, corrispondere alla backspace (0x08) quando è all'interno dei parentesi.
\BCorrispondere a non-boundary di parola.
\n, \t, etc.Corrispondere al carattere di nuova riga, il carattere di invio, il tabulatore, ecc.
\1...\9Corrispondere alla n-esima espressione regolare di gruppo.
\10Se è stato fatto una corrispondenza prima, allora corrispondere alla n-esima espressione regolare di gruppo. Altrimenti, puntare alla rappresentazione ottale del codice di carattere.

Esempio di espressione regolare

Espressione regolare

示例描述
/ruby/Corrisponde a "ruby"
¥Corrisponde al simbolo Yen. Ruby 1.9 e Ruby 1.8 supportano più di un carattere.

Carattere

示例描述
/[Rr]uby/Corrisponde a "Ruby" o "ruby"
/rub[ye]/匹配 "ruby" 或 "rube"
/[aeiou]/Corrisponde a qualsiasi vocale minuscola
/[0-9]/Corrisponde a qualsiasi numero, uguale a /[0123456789]/
/[a-z]/Corrisponde a qualsiasi lettera ASCII minuscola
/[A-Z]/Corrisponde a qualsiasi lettera ASCII maiuscola
/[a-zA-Z0-9]/Corrisponde a qualsiasi carattere all'interno di parentesi quadre
/[^aeiou]/Corrisponde a qualsiasi carattere non vocale minuscola
/[^0-9]/Corrisponde a qualsiasi carattere non numerico

Carattere speciale

示例描述
/./Corrisponde a qualsiasi carattere diverso dal carattere di newline
/./mIn modalità multilinea, può anche corrispondere a un carattere di newline
/\d/Corrisponde a un carattere numerico, equivalente a /[0-9]/
/\D/Corrisponde a un carattere non numerico, equivalente a /[^0-9]/
/\s/Corrisponde a un carattere bianco, equivalente a /[ \t\r\n\f]/
/\S/Corrisponde a un carattere non bianco, equivalente a /[^ \t\r\n\f]/
/\w/Corrisponde a un carattere parole, equivalente a /[A-Za-z0-9_]/
/\W/Corrisponde a un carattere non parole, equivalente a /[^A-Za-z0-9_]/

Ripetizione

示例描述
/ruby?/Corrisponde a "rub" o "ruby". Y è opzionale.
/ruby*/Corrisponde a "rub" più 0 o più di y.
/ruby+/Corrisponde a "rub" più 1 o più di y.
/\d{3}/Corrisponde esattamente a 3 numeri.
/\d{3,}/Corrisponde a 3 o più numeri.
/\d{3,5}/Corrisponde a 3, 4 o 5 numeri.

Ripetizione non avida

Questo corrisponde alla ripetizione minima.

示例描述
/<.*>/Ripetizione avida: corrisponde a "<ruby>perl>"
/<.*?>/Ripetizione non avida: corrisponde a "<ruby>perl>" con "<ruby>"

Gruppo con parentesi tonde

示例描述
/\D\d+/Senza gruppo: + ripetizione di \d
/(\D\d)+/Gruppo: + ripetizione di \D\d
/([Rr]uby(, )?)+/Corrisponde a "Ruby", "Ruby, ruby, ruby" e così via

反向引用

这会再次匹配之前匹配过的分组。

示例描述
/([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 反向引用

搜索和替换

subgsub 及它们的代替变量 sub!gsub! 是使用正则表达式时重要的字符串方法。

所有这些方法都是使用正则表达式模式执行搜索与替换操作。subsub! 替换模式的第一次出现,gsubgsub! 替换模式的所有出现。

subgsub 返回一个新的字符串,保持原始的字符串不被修改,而 sub!gsub! 则会修改它们调用的字符串。

Esempio online

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
phone = "138-3453-1111 #这是一个电话号码"
 
# 删除 Ruby 的注释
phone = phone.sub!(/#.*$/, "")   
puts "Numero di telefono : #{phone}"
 
# 移除数字以外的其他字符
phone = phone.gsub!(/\D/, "")    
puts "Numero di telefono : #{phone}"

Esempi di sopra eseguiti risultati di output:

Numero di telefono : 138-3453-1111 
Numero di telefono : 13834531111

Esempio online

#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
 
text = "rails è rails, molto buono framework Ruby per Ruby on Rails"
 
# Convertire tutte le "rails" in "Rails"
text.gsub!("rails", "Rails")
 
# Convertire tutte le parole "Rails" in maiuscolo
text.gsub!(/\brails\b/, "Rails")
 
puts "#{text}"

Esempi di sopra eseguiti risultati di output:

Rails è Rails, molto buono framework Ruby per Ruby on Rails