Skip to content

Latest commit

 

History

History
101 lines (78 loc) · 3.21 KB

10_strings.adoc

File metadata and controls

101 lines (78 loc) · 3.21 KB

Extensions to String

The class de.fhg.fokus.xtensions.string.StringSplitExtensions provides extension methods for java.lang.String allowing to lazily split a string value.

The extension method splitIt returns an Iterator which lazily performs string split operations based on a regular expression (same String#split(String)) would do, but lazily. This allows the use of Iterator extension methods provided by Xtend and to stop splitting a string when a condition is met without splitting the complete input string beforehand.

Example:

import static extension de.fhg.fokus.xtensions.string.StringSplitExtensions.*
// ...
val Iterator<String> i = "foozoobaar".splitIt("(?<=oo)")
i.takeWhile[!startsWith("b")].forEach[
	println(it)
]
Tip

If a split pattern is known in advance the following is possible with the JDK types to obtain a Stream of split elements:

import java.util.regex.Pattern
// ...
extension val pattern = Pattern.compile("mypattern")
// ...
"tosplit".splitAsStream  // actually calls pattern.splitAsStream("tosplit")

If a pattern String has to be produced dynamically, the extension method splitAsStream is provided as a shortcut for the sequence of calls from above:

import static extension de.fhg.fokus.xtensions.string.StringSplitExtensions.*
// ...
val String patternStr = ... // dynamically created pattern
"tosplit".splitAsStream(patternStr)

The class de.fhg.fokus.xtensions.string.SptringMatchExtensions provides extension methods to java.lang.String, allowing to match regular expressions lazily via iterators.

To manually get matches for a pattern from an input string with JDK classes the following sequence has to be used:

import java.util.regex.Pattern
// ...
val String input = "foo bar boo"
val Pattern pattern = Pattern.compile("(\\woo)")
val matcher = pattern.matcher(input)
while(matcher.find) {
	val match = input.subSequence(matcher.start, matcher.end)
	// Do something with match
	println(match)
}

The extension method matchIt elegantly wraps this usage pattern into an Iterator, so the Xtend combinators can be used on them.

import static extension de.fhg.fokus.xtensions.string.StringMatchExtensions.*
import java.util.regex.Pattern
// ...
val String input = "foo bar boo"
val Pattern pattern = Pattern.compile("(\\woo)")
input.matchIt(pattern).forEach [
	println(it)
]

The method matchIt is overloaded to also take a string of the pattern, which internally compiles it to a pattern.

Having a stream of MatchResults for a pattern applied to a given input string can be achieved with the matchResultIt extension method. This can be useful, if other group captures have to be accessed when handling matches.