English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
正则表达式是一种特殊序列的字符,它通过使用有专门语法的模式来匹配或查找字符串集合。
正则表达式用事先定义好的一些特定字符、及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串"用来表达对字符串的一种过滤逻辑。
正则表达式从字面上看是一种介于斜杠之间或介于跟在 %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
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| b | Corrispondere 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. |
\w | Corrispondere a character of parola. |
\W | Corrispondere a non-character of parola. |
\s | Corrispondere a character space. Equivalente a [\t\n\r\f]. |
\S | Corrispondere a non-character space. |
\d | Corrispondere a digit. Equivalente a [0-9]. |
\D | Corrispondere a non-digit. |
\A | Corrispondere all'inizio della stringa. |
\Z | Corrispondere alla fine della stringa. Se esiste un carattere di nuova riga, corrispondere solo alla fine del carattere di nuova riga. |
\z | Corrispondere alla fine della stringa. |
\G | Corrispondere all'ultimo punto corrispondente completato. |
\b | Corrispondere al boundary di parola quando è fuori dai parentesi, corrispondere alla backspace (0x08) quando è all'interno dei parentesi. |
\B | Corrispondere a non-boundary di parola. |
\n, \t, etc. | Corrispondere al carattere di nuova riga, il carattere di invio, il tabulatore, ecc. |
\1...\9 | Corrispondere alla n-esima espressione regolare di gruppo. |
\10 | Se è stato fatto una corrispondenza prima, allora corrispondere alla n-esima espressione regolare di gruppo. Altrimenti, puntare alla rappresentazione ottale del codice di carattere. |
示例 | 描述 |
---|---|
/ruby/ | Corrisponde a "ruby" |
¥ | Corrisponde al simbolo Yen. Ruby 1.9 e Ruby 1.8 supportano più di un 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 |
示例 | 描述 |
---|---|
/./ | Corrisponde a qualsiasi carattere diverso dal carattere di newline |
/./m | In 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_]/ |
示例 | 描述 |
---|---|
/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. |
Questo corrisponde alla ripetizione minima.
示例 | 描述 |
---|---|
/<.*>/ | Ripetizione avida: corrisponde a "<ruby>perl>" |
/<.*?>/ | Ripetizione non avida: corrisponde a "<ruby>perl>" con "<ruby>" |
示例 | 描述 |
---|---|
/\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 反向引用 |
sub 和 gsub 及它们的代替变量 sub! 和 gsub! 是使用正则表达式时重要的字符串方法。
所有这些方法都是使用正则表达式模式执行搜索与替换操作。sub 和 sub! 替换模式的第一次出现,gsub 和 gsub! 替换模式的所有出现。
sub 和 gsub 返回一个新的字符串,保持原始的字符串不被修改,而 sub! 和 gsub! 则会修改它们调用的字符串。
#!/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
#!/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