Current section

Files

Jump to
gleam_stdlib src gleam regex.gleam
Raw

src/gleam/regex.gleam

//// This module contains regular expression matching functions for strings.
//// The matching algorithms of the library are based on the PCRE library, but not
//// all of the PCRE library is interfaced and some parts of the library go beyond
//// what PCRE offers. Currently PCRE version 8.40 (release date 2017-01-11) is used.
import gleam/option.{Option}
pub external type Regex
/// The details about a particular match:
///
pub type Match {
Match(
/// The full string of the match.
content: String,
/// The byte index of the match in the original string.
byte_index: Int,
/// A Regex can have subpatterns, sup-parts that are in parentheses.
submatches: List(Option(String)),
)
}
/// When a regular expression fails to compile:
///
pub type CompileError {
CompileError(
/// The problem encountered that caused the compilation to fail
error: String,
/// The byte index into the string to where the problem was found
byte_index: Int,
)
}
pub type Options {
Options(case_insensitive: Bool, multi_line: Bool)
}
/// Creates a Regex with some additional options.
///
/// ## Examples
///
/// > let options = Options(case_insensitive: False, multi_line: True)
/// > assert Ok(re) = compile("^[0-9]", with: options)
/// > match(re, "abc\n123")
/// True
///
/// > let options = Options(case_insensitive: True, multi_line: False)
/// > assert Ok(re) = compile("[A-Z]", with: options)
/// > match(re, "abc123")
/// True
///
pub external fn compile(String, with: Options) -> Result(Regex, CompileError) =
"gleam_stdlib" "compile_regex"
/// Creates a new Regex.
///
/// ## Examples
///
/// > assert Ok(re) = from_string("[0-9]")
/// > match(re, "abc123")
/// True
///
/// > match(re, "abcxyz")
/// False
///
/// > from_string("[0-9")
/// Error(
/// CompileError(
/// error: "missing terminating ] for character class",
/// byte_index: 4
/// )
/// )
///
pub fn from_string(pattern: String) -> Result(Regex, CompileError) {
compile(pattern, Options(case_insensitive: False, multi_line: False))
}
/// Returns a boolean indicating whether there was a match or not.
///
/// ## Examples
///
/// > assert Ok(re) = from_string("^f.o.?")
/// > check(with: re, content: "foo")
/// True
///
/// > check(with: re, content: "boo")
/// False
///
pub external fn check(with: Regex, content: String) -> Bool =
"gleam_stdlib" "regex_match"
/// Splits a string
///
/// ## Examples
///
/// > assert Ok(re) = from_string(" *, *")
/// > split(with: re, content: "foo,32, 4, 9 ,0")
/// ["foo", "32", "4", "9", "0"]
///
pub external fn split(with: Regex, content: String) -> List(String) =
"gleam_stdlib" "regex_split"
/// Collects all matches of the regular expression.
///
/// ## Examples
///
/// > assert Ok(re) = regex.from_string("[oi]n a (\\w+)")
/// > regex.scan(with: re, content: "I am on a boat in a lake.")
/// [
/// Match(
/// content: "on a boat",
/// byte_index: 5,
/// submatches: [Some("boat")]
/// ),
/// Match(
/// content: "in a lake",
/// byte_index: 15,
/// submatches: [Some("lake")]
/// )
/// ]
///
pub external fn scan(with: Regex, content: String) -> List(Match) =
"gleam_stdlib" "regex_scan"