使用 Vavr 获取正则表达式组
Get regular expression groups with Vavr
考虑到 Vavr 在正则表达式中提供 tuples, is it possible to use them for capturing groups?
以HTTP请求行为例进行匹配
GET /resource HTTP 1.1
和匹配模式
Pattern.compile("(\w+) (.+) (.+)")
Vavr 中是否有方法 return 三个匹配的字符串作为一个元组?
自己创建这个很容易:
/**
* Gets the three matched groups of the {@code regex} from the {@code original}.
*
* @param regex a {@link Pattern} that should have three groups in it and
match the {@code original}
* @param original the string we'll match with the {@code regex}
* @return a {@link Tuple3} of the three matched groups or {@link Option#none} if
* the {@code regex} did not match
*/
static Option<Tuple3<String, String, String>> getGroups3(Pattern regex,
CharSequence original) {
var matcher = regex.matcher(original);
return matcher.matches() && matcher.groupCount() == 3 ?
Some(Tuple.of(matcher.group(1), matcher.group(2), matcher.group(3))) :
Option.none();
}
你可以这样使用这个方法:
var pattern = Pattern.compile("(\w+) (.+) (.+)");
var requestLine = "GET /resource HTTP 1.1";
var result = getGroups3(pattern, requestLine).fold(
// No match
() -> String.format("Could not parse request method, resource, and " +
"HTTP version from request line. Request line is '%s'",
requestLine),
// Do whatever you want with the three matched strings
tuple3 -> tuple3.apply((method, resource, httpVersion) ->
String.format("Method is %s, resource is %s, HTTP version is %s",
method, resource, httpVersion)));
考虑到 Vavr 在正则表达式中提供 tuples, is it possible to use them for capturing groups?
以HTTP请求行为例进行匹配
GET /resource HTTP 1.1
和匹配模式
Pattern.compile("(\w+) (.+) (.+)")
Vavr 中是否有方法 return 三个匹配的字符串作为一个元组?
自己创建这个很容易:
/**
* Gets the three matched groups of the {@code regex} from the {@code original}.
*
* @param regex a {@link Pattern} that should have three groups in it and
match the {@code original}
* @param original the string we'll match with the {@code regex}
* @return a {@link Tuple3} of the three matched groups or {@link Option#none} if
* the {@code regex} did not match
*/
static Option<Tuple3<String, String, String>> getGroups3(Pattern regex,
CharSequence original) {
var matcher = regex.matcher(original);
return matcher.matches() && matcher.groupCount() == 3 ?
Some(Tuple.of(matcher.group(1), matcher.group(2), matcher.group(3))) :
Option.none();
}
你可以这样使用这个方法:
var pattern = Pattern.compile("(\w+) (.+) (.+)");
var requestLine = "GET /resource HTTP 1.1";
var result = getGroups3(pattern, requestLine).fold(
// No match
() -> String.format("Could not parse request method, resource, and " +
"HTTP version from request line. Request line is '%s'",
requestLine),
// Do whatever you want with the three matched strings
tuple3 -> tuple3.apply((method, resource, httpVersion) ->
String.format("Method is %s, resource is %s, HTTP version is %s",
method, resource, httpVersion)));