Что именно создает Regex с помощью Regex.fromLiteral ()?

Я создал очень простое совпадение – все Regex с 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(".*")) } 

Вывод:

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

поэтому, по-видимому (и вопреки моим ожиданиям), Regex.fromLiteral() и String.toRegex() ведут себя совершенно по-другому (я пробовал десятки разных аргументов для regex2.matches() – единственный, который возвращался true .* )

Означает ли это, что Regex, созданный с помощью Regex.fromLiteral() всегда соответствует только точной строке, с которой она была создана?

Если да, то какие возможные варианты использования для такого регулярного выражения? (Я не могу придумать ни одного сценария, где это было бы полезно)

Да, это действительно создает регулярное выражение, которое соответствует буквальным символам в String . Это удобно, когда вы пытаетесь сопоставить символы, которые будут интерпретироваться в регулярном выражении – вам не нужно их избегать.

Например, если вы ищете строки, которые содержат .*[](1)?[2] , вы можете сделать следующее:

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

Конечно, вы можете делать почти все, что вы можете сделать с Regex с помощью обычных методов String .

 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() создает экземпляр объекта регулярных выражений, избегая специальных метасимволов регулярных выражений. Образец, который вы получаете, на самом деле \.\* , И поскольку вы использовали match matches() , для которого требуется полное совпадение строк, вы можете сопоставлять строку .* С ним (с помощью find() вы можете сопоставить его где угодно внутри строки).

См. Исходный код :

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