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))