Вы можете использовать
val page1 = "<a href=\"http://weqweqwewqewqeqwe\">"
val urlMatcher = "\"([^\"]*)\"".toRegex()
// Or, you may reduce escaping with a triple-quoted string literal:
// val urlMatcher = """"([^"]*)"""".toRegex()
println(urlMatcher.find(page1)?.value) // => "http://weqweqwewqewqeqwe"
println(urlMatcher.find(page1)?.groupValues?.getOrNull(1)) // => http://weqweqwewqewqeqwe
См. Демоверсию Kotlin .Обратите внимание на синтаксис Regex#find(String)
.После того, как вы получите совпадение, .value
извлечет вам все значение совпадения (без необходимости .groupValues?.getOrNull(0)
), а .groupValues?.getOrNull(1)
извлечет значение внутри группы 1.
Шаблон "([^"]*)"
соответствует "
, затем захватывает 1 или более символов, отличных от "
, в группу 1 (с [^"]*
), а затем сопоставляет закрывающую двойную кавычку.
Всякий раз, когда вам нужно сопоставить подстроку "..."
, которая можетсодержать экранированные двойные кавычки использовать
val urlMatcher = """(?s)(?<!\\)(?:\\{2})*("[^\\"]*(?:\\.[^"\\]*)*")""".toRegex()
Чтобы захватить только подстроку между двойными кавычками, переместите круглые скобки, как показано ниже:
"""(?s)(?<!\\)(?:\\{2})*"(([^\\"]*(?:\\.[^"\\]*)*))""""
^ ^
См. этоregex demo .
Детали шаблона
(?s)
- .
теперь соответствует любому символу (?<!\\)
- нет \
charможет присутствовать непосредственно слева от текущей позиции (?:\\{2})*
- 0 или более последовательностей двойной обратной косой черты (таким образом, все экранированные кавычки будут игнорироваться) "
- двойнойцитата ([^\\"]*(?:\\.[^"\\]*)*)
- Группа захвата 1: [^\\"]*
- 0+ символов, отличных от \
и "
(?:\\.[^"\\]*)*
- 0+ вхождений \\.
- \
, за которым следует любой символ [^\\"]*
- 0+ символов, отличных от \
и "
"
- двойная кавычка.