Live Coding Learnings - June 18, 2019
Tags: todayilearned, livecoding, java
Published: 2019-06-19 00:49:29

---
title: Live Coding Learnings - June 18, 2019
published: true
description: Today's learnings from the live coding stream.
tags: TIL, LiveCoding, Java
series: Live Coding Lessons Learned
---

> Summary of what I learned in today's live coding stream at https://twitch.tv/jitterted.

## Matching newlines in RegEx

For the text I'm working with, I want regex search and replace to work across newlines (by default matching stops at a new line). Today I learned that I need to pre-pend this: `(?s)` to the regex String, which turns on `DOTALL` mode and therefore the dot wildcard will match across new lines. For details, see the JavaDoc: https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#DOTALL

### Example of `matches()` using `DOTALL`

I want to search for text that's surrounded by 3 equal signs (`===`)
both at the beginning and at the end. The text can span multiple lines.

For example:

```
Before text.
===
Text inside the equals signs.
===
Outside text.
```

To search for the text, I would use the `String.matches()` method, like this:

```java
boolean found = text.matches("(?s)===(.*?)===");
```

Which returns `true` if the pattern is found, as it would be in the
above example.

### Example of `replaceAll` using `DOTALL`

If I want to replace the triple backtick code block with a `<pre>` tag (as I do in my live stream), then I'd do this:

{% gist https://gist.github.com/tedyoung/d344fb9d89597943de54de0e92041164 %}

Which would output this:

```
<pre>
public class Stock {

}
</pre>
```

## Scanner for Parsing

I used `Scanner` in a few places and forgot about it until I was reminded by one of my regular stream viewers (thanks *flamaddidle84*!). Today, I wanted to parse some text and split the lines whenever there was an empty line between two non-empty lines.

For example, given this text:

```
Block one.
Still part of block one.
Yep, still part of block one.

Block two here.
Still part of block two.

Last block here.
```

I want to end up with three pieces of text. Using the `Scanner` class and the fact that the delimiter can be specified, this is all I needed:

```java
Scanner scanner = new Scanner(text).useDelimiter("\n\n");
```

Then, all I had to do was use the `scanner.tokens()` method (only available starting in Java 9) to give me a stream of these blocks, e.g.:

```java
scanner.tokens()
       .map(s -> "<p>" + s + "</p>\n")
       .collect(Collectors.toList());
```

Which uses `replaceAll` on each block to surround it with the HTML `<p>` (paragraph) tag. Here's a full code example:

{% gist https://gist.github.com/tedyoung/1df7401b453cb779a9b5ac2389df6baa %}

When run, it results in this output:

```
<p>Block one.
Still part of block one.
Yep, still part of block one.</p>

<p>Block two here.
Still part of block two.</p>

<p>Last block here.
</p>
```

# Watch Me Live Code on Twitch

If you want to see how I use TDD to code in Java and Spring, and learn with me, tune in to my daily stream at [Twitch.TV/JitterTed](https://twitch.tv/jitterted). I'm usually streaming from 12pm PDT (1900 UTC) for around 3 hours. You can also chat with me on [my Discord](https://discord.gg/9XDfBSZ).