как сопоставить строку в двойных кавычках в kotlin с помощью регулярных выражений - PullRequest
0 голосов
/ 17 сентября 2018

Я хочу найти строку внутри двойных кавычек.

text : <a href = "http://weqweqwewqewqeqwe">

expected : http://weqweqwewqewqeqwe

как получить строку с помощью регулярных выражений.

val page1 = "<a href=\"http://weqweqwewqewqeqwe\">"
val urlMatcher = "\".+\"".toRegex()
println(page1.split(urlMatcher))

Код выше - мое мышление.но, это не работает хорошо.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вы можете использовать

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+ символов, отличных от \ и "
  • " - двойная кавычка.
0 голосов
/ 17 сентября 2018

Используйте скобки для группировки определенной части сопоставленного с регулярным выражением текста:

val urlMatcher = "\"(.+)\"".toRegex()

А затем используйте find для извлечения текста, соответствующего вашему регулярному выражению, из строки, например:

urlMatcher.find(text)?.groupValues?.getOrNull(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...