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

Scala 正则表达式

Scala utilizza il pacchetto scala.util.matching per Regex La classe per supportare le espressioni regolari. Esempio di utilizzo delle espressioni regolari per cercare parole: Scala :

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = "Scala".r
      val str = "Scala è Scalable and cool"
      
      println(pattern findFirstIn str)
   }
}

执行以上代码,输出结果为:

$ scalac Test.scala 
$ scala Test
Some(Scala)

Nell'esempio viene utilizzato il metodo r() della classe String per costruire un oggetto Regex.

Poi utilizzare il metodo findFirstIn per trovare la prima corrispondenza.

Se si desidera visualizzare tutte le corrispondenze, utilizzare il metodo findAllIn.

Puoi utilizzare il metodo mkString( ) per connettere le stringhe dei risultati della corrispondenza regolare e puoi utilizzare il tubo (|) per impostare diversi modelli:

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala") // La lettera iniziale può essere maiuscola S o minuscola s
      val str = "Scala è scalabile e cool"
      
      println((pattern findAllIn str).mkString(",")) // Usa la virgola , per connettere i risultati
   }
}

执行以上代码,输出结果为:

$ scalac Test.scala 
$ scala Test
Scala,scala

Se si desidera sostituire il testo corrispondente con una parola chiave specifica, si può utilizzare replaceFirstIn( ) Il metodo sostituisce la prima corrispondenza, utilizzando replaceAllIn( ) Il metodo sostituisce tutti i corrispondenze, come nell'esempio seguente:

object Test {
   def main(args: Array[String]) {
      val pattern = "(S|s)cala".r
      val str = "Scala è scalabile e cool"
      
      println(pattern replaceFirstIn(str, "Java"))
   }
}

执行以上代码,输出结果为:

$ scalac Test.scala 
$ scala Test
Java è scalabile e cool

Espressioni regolari

Le espressioni regolari di Scala ereditano le regole di sintassi di Java, mentre Java utilizza in gran parte le regole del linguaggio Perl.

Nella tabella di seguito forniamo alcune regole di espressioni regolari comuni:

EspressioneRegola di abbatimento
^ Abbatte la posizione iniziale della stringa di input.
$Abbatte la posizione finale della stringa di input.
.Corrisponde a qualsiasi singolo carattere diverso da "\r\n"
[...]Setto di caratteri. Abbatte qualsiasi carattere incluso. Ad esempio, "[abc]" abbatte "plain" in "a".
[^...]Setto di caratteri inverso. Abbatte qualsiasi carattere non incluso. Ad esempio, "[^abc]" abbatte "plain" in "p", "l", "i", "n".
\\ACorrisponde alla posizione iniziale della stringa di input (senza supporto multi-linea)
\\zFine della stringa (simile a $, ma non influenzato dall'opzione di elaborazione multi-linea)
\\ZFine della stringa o della riga (non influenzato dall'opzione di elaborazione multi-linea)
re*Ripeti zero volte o più volte
re+Ripeti una volta o più volte
re?Ripeti zero volte o una volta
re{ n}Ripeti n volte
re{ n,}Ripeti n volte o più volte
re{ n, m}Ripeti n a m volte
a|bCorrisponde a a o b
(re)Corrisponde a re, e cattura il testo nel gruppo automaticamente denominato
(?: re)Corrisponde a re, senza catturare il testo corrispondente, né assegnare un numero di gruppo a questa partizione
(?> re)Espressione regolare avida
\\wCorrisponde a lettera o numero o trattino o cinese
\\WCorrisponde a qualsiasi carattere non lettera, numero, trattino, cinese
\\sCorrisponde a qualsiasi carattere bianco, equivalente a [\t\n\r\f]
\\SCorrisponde a qualsiasi carattere non bianco
\\dCorrisponde a numeri, simile a [0-9]
\\DCorrisponde a qualsiasi carattere non numerico
\\GInizio della ricerca corrente
\\nCarattere di newline
\\bDi solito è una posizione di separazione di parola, ma se usato all'interno di un carattere di classe rappresenta il backspace
\\BCorrisponde a posizioni non iniziali o finali di parola
\\tTabulatore
\\QInizio virgoletta:\Q(a+b)*3\E Può corrispondere al testo "(a+b)*3".
\\EFine virgoletta:\Q(a+b)*3\E Può corrispondere al testo "(a+b)*3".

Esempio di espressione regolare

示例Descrizione
.Corrisponde a qualsiasi singolo carattere diverso da "\r\n"
[Rr]ubyCorrisponde a "Ruby" o "ruby"
rub[ye]Corrisponde a "ruby" o "rube"
[aeiou]Corrisponde a lettere minuscole :aeiou
[0-9]Corrisponde a qualsiasi numero, simile a [0123456789]
[a-z]Corrisponde a qualsiasi lettera minuscola ASCII
[A-Z]Corrisponde a qualsiasi lettera maiuscola ASCII
[a-zA-Z0-9]Corrisponde a numeri e lettere maiuscole e minuscole
[^aeiou]Corrisponde a caratteri diversi da aeiou
[^0-9]Corrisponde a caratteri diversi dai numeri
\\dCorrisponde a numeri, simile a: [0-9]
\\DCorrisponde a non numeri, simile a: [^0-9]
\\sCorrisponde a spazi, simile a: [ \t\r\n\f]
\\SCorrisponde a non spazi, simile a: [^ \t\r\n\f]
\\wCorrisponde a lettere, numeri, trattini, simile a: [A-Za-z0-9_]
\\WCorrisponde a non lettere, numeri, trattini, simile a: [^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 个数字。
\\D\\d+无分组: + 重复 \d
(\\D\\d)+/分组: + 重复 \D\d 对
([Rr]uby(, )?)+匹配 "Ruby"、"Ruby, ruby, ruby",等等

注意上表中的每个字符使用了两个反斜线。这是因为在 Java 和 Scala 中字符串中的反斜线是转义字符。所以如果你要输出 \,你需要在字符串中写成 \\ 来获取一个反斜线。查看以下示例:

import scala.util.matching.Regex
object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]\\d+")
      val str = "ablaw is able1 and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

执行以上代码,输出结果为:

$ scalac Test.scala 
$ scala Test
able1