Skip to content

Add code tabs for _tour/regular-expression-patterns #2534

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 20, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 75 additions & 1 deletion _tour/regular-expression-patterns.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ redirect_from: "/tutorials/tour/regular-expression-patterns.html"

Regular expressions are strings which can be used to find patterns (or lack thereof) in data. Any string can be converted to a regular expression using the `.r` method.

{% tabs regex-patterns_numberPattern class=tabs-scala-version %}

{% tab 'Scala 2' for=regex-patterns_numberPattern %}
```scala mdoc
import scala.util.matching.Regex

Expand All @@ -23,12 +26,30 @@ numberPattern.findFirstMatchIn("awesomepassword") match {
case None => println("Password must contain a number")
}
```
{% endtab %}

{% tab 'Scala 3' for=regex-patterns_numberPattern %}
```scala
import scala.util.matching.Regex

val numberPattern: Regex = "[0-9]".r

numberPattern.findFirstMatchIn("awesomepassword") match
case Some(_) => println("Password OK")
case None => println("Password must contain a number")
```
{% endtab %}

{% endtabs %}

In the above example, the `numberPattern` is a `Regex`
(regular expression) which we use to make sure a password contains a number.

You can also search for groups of regular expressions using parentheses.

{% tabs regex-patterns_keyValPattern class=tabs-scala-version %}

{% tab 'Scala 2' for=regex-patterns_keyValPattern %}
```scala mdoc
import scala.util.matching.Regex

Expand All @@ -47,6 +68,31 @@ val input: String =
for (patternMatch <- keyValPattern.findAllMatchIn(input))
println(s"key: ${patternMatch.group(1)} value: ${patternMatch.group(2)}")
```
{% endtab %}

{% tab 'Scala 3' for=regex-patterns_keyValPattern %}
```scala
import scala.util.matching.Regex

val keyValPattern: Regex = "([0-9a-zA-Z- ]+): ([0-9a-zA-Z-#()/. ]+)".r

val input: String =
"""background-color: #A03300;
|background-image: url(img/header100.png);
|background-position: top center;
|background-repeat: repeat-x;
|background-size: 2160px 108px;
|margin: 0;
|height: 108px;
|width: 100%;""".stripMargin

for patternMatch <- keyValPattern.findAllMatchIn(input) do
println(s"key: ${patternMatch.group(1)} value: ${patternMatch.group(2)}")
```
{% endtab %}

{% endtabs %}

Here we parse out the keys and values of a String. Each match has a group of sub-matches. Here is the output:
```
key: background-color value: #A03300
Expand All @@ -61,6 +107,9 @@ key: width value: 100

Moreover, regular expressions can be used as patterns (in `match` expressions) to conveniently extract the matched groups:

{% tabs regex-patterns_saveContactInfomation class=tabs-scala-version %}

{% tab 'Scala 2' for=regex-patterns_saveContactInfomation %}
```scala mdoc
def saveContactInfomation(contact: String): Unit = {
import scala.util.matching.Regex
Expand All @@ -82,11 +131,36 @@ saveContactInfomation("123-456-7890")
saveContactInfomation("JohnSmith@sample.domain.com")
saveContactInfomation("2 Franklin St, Mars, Milky Way")
```
{% endtab %}

{% tab 'Scala 3' for=regex-patterns_saveContactInfomation %}
```scala
def saveContactInfomation(contact: String): Unit =
import scala.util.matching.Regex

val emailPattern: Regex = """^(\w+)@(\w+(.\w+)+)$""".r
val phonePattern: Regex = """^(\d{3}-\d{3}-\d{4})$""".r

contact match
case emailPattern(localPart, domainName, _) =>
println(s"Hi $localPart, we have saved your email address.")
case phonePattern(phoneNumber) =>
println(s"Hi, we have saved your phone number $phoneNumber.")
case _ =>
println("Invalid contact information, neither an email address nor phone number.")

saveContactInfomation("123-456-7890")
saveContactInfomation("JohnSmith@sample.domain.com")
saveContactInfomation("2 Franklin St, Mars, Milky Way")
```
{% endtab %}

{% endtabs %}

The output would be:

```
Hi, we have saved your phone number 123-456-7890.
Hi JohnSmith, we have saved your email address.
Invalid contact information, neither an email address nor phone number.
```
```