加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用Regex.fromLiteral()创建的正则表达式到底匹配什么?

发布时间:2020-12-14 06:04:34 所属栏目:百科 来源:网络整理
导读:我用 Regex.fromLiteral(“.*”)创建了一个非常简单的匹配所有正则表达式. 根据documentation:“返回指定文字字符串的文字正则表达式.” 但我并没有真正得到“对于指定的文字字符串”应该是什么意思. 考虑这个例子: fun main(args: ArrayString) { val reg
我用 Regex.fromLiteral(“.*”)创建了一个非常简单的匹配所有正则表达式.

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

但我并没有真正得到“对于指定的文字字符串”应该是什么意思.

考虑这个例子:

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()创建的正则表达式始终只匹配它创建的确切字符串?

如果是,那么这种正则表达式的可能用例是什么? (我想不出任何有用的场景)

解决方法

是的,它确实创建了一个与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方法.对于某些用例,针对不同输入的这些不同操作的性能也可能是有趣的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读