Regex使用Regex.fromLiteral()创建了什么内容?

我用Regex.fromLiteral(".*")创建了一个非常简单的match-all Regex。

根据文档 :“返回指定文字字符串的文字正则表达式”。

但是我真的不明白“为指定的文字字符串”应该是什么意思。

考虑这个例子:

 fun main(args: Array<String>) { val regex1 = ".*".toRegex() val regex2 = Regex.fromLiteral(".*") println("regex1 matches abc: " + regex1.matches("abc")) println("regex2 matches abc: " + regex2.matches("abc")) println("regex2 matches .* : " + regex2.matches(".*")) } 

输出:

 regex1 matches abc: true regex2 matches abc: false regex2 matches .* : true 

显然(和我的预期相反), Regex.fromLiteral()String.toRegex()行为完全不同(我已经尝试了regex2.matches()几十个不同的参数 – 唯一返回true的是.*

这是否意味着使用Regex.fromLiteral()创建的Regex总是只匹配它创建的确切字符串

如果是的话,这样的正则表达式有什么用例呢? (我想不出任何有用的场景)

是的,它确实创建了一个匹配String中的文字字符的正则表达式。 当你试图匹配在正则表达式中被解释的符号时,这是很方便的 – 你不必以这种方式逃避它们。

例如,如果您正在查找包含.*[](1)?[2]字符串,则可以执行以下操作:

 val regex = Regex.fromLiteral(".*[](1)?[2]") regex.containsMatchIn("foo") // false regex.containsMatchIn("abc.*[](1)?[2]abc") // true 

当然,你也可以用普通的String方法做几乎所有你可以用的正则Regex

 val literal = ".*[](1)?[2]" literal == "foo" // equality checks literal in "abc.*[](1)?[2]abc" // containment checks "some string".replace(literal, "new") // replacements 

但是有时你需要一个Regex实例作为参数,所以在这种情况下可以使用fromLiteral方法。 对于不同的输入来说,执行这些不同的操作对于一些使用情况也是有意义的。

Regex.fromLiteral()实例化一个正则表达式对象,同时转义特殊的正则表达式元字符。 你得到的模式实际上是\.\* ,而且由于你使用了需要完整字符串匹配的matches() ,所以你只能匹配一个.*字符串(用find()可以匹配它在字符串中的任何地方)。

查看源代码 :

public fun fromLiteral(literal: String): Regex = Regex(escape(literal))