我已经创建了一个非常简单的匹配所有正则表达式Regex.fromLiteral(".*").
根据文档:"返回指定文字字符串的文字正则表达式."
但我并没有真正得到"对于指定的文字字符串"应该是什么意思.
考虑这个例子:
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(".*"))
}
Run Code Online (Sandbox Code Playgroud)
输出:
regex1 matches abc: true
regex2 matches abc: false
regex2 matches .* : true
Run Code Online (Sandbox Code Playgroud)
显然(并且与我的期望相反),Regex.fromLiteral()并且String.toRegex()行为完全不同(我已经尝试过几十个不同的论点regex2.matches()- 唯一一个返回真实的论点是.*)
这是否意味着创建的正则表达式Regex.fromLiteral()始终只匹配它创建的确切字符串?
如果是,那么这种正则表达式的可能用例是什么?(我想不出任何有用的场景)
是的,它确实创建了一个匹配文字字符的正则表达式String.当你试图匹配将在正则表达式中解释的符号时,这很方便 - 你不必以这种方式逃避它们.
例如,如果您要查找包含的字符串,则.*[](1)?[2]可以执行以下操作:
val regex = Regex.fromLiteral(".*[](1)?[2]")
regex.containsMatchIn("foo") // false
regex.containsMatchIn("abc.*[](1)?[2]abc") // true
Run Code Online (Sandbox Code Playgroud)
当然,你几乎可以Regex用常规String方法做任何事情.
val literal = ".*[](1)?[2]"
literal == "foo" // equality checks
literal in "abc.*[](1)?[2]abc" // containment checks
"some string".replace(literal, "new") // replacements
Run Code Online (Sandbox Code Playgroud)
但有时您需要一个Regex实例作为参数,因此该fromLiteral方法可用于这些情况.对于某些用例,针对不同输入的这些不同操作的性能也可能是有趣的.
该Regex.fromLiteral()实例化一个正则表达式对象,而逃离特殊的正则表达式元字符.你得到的模式实际上是\.\*,因为你使用matches()它需要一个完整的字符串匹配,你只能匹配一个.*字符串(find()你可以匹配它在字符串内的任何地方).
查看源代码:
public fun fromLiteral(literal: String): Regex = Regex(escape(literal))
| 归档时间: |
|
| 查看次数: |
1311 次 |
| 最近记录: |