Регулярные выражения в scala, найдите значение, соответствующее ключу

#regex #scala

#регулярное выражение #scala

Вопрос:

Я новичок в Scala, и я не совсем уверен, как работает regex.

Я хочу извлечь значение из строки.

 String = "key1=value1amp;key2=value2amp;key3=value3"
  

Мне нужно выяснить, что такое значение2.

Могу ли я сделать это с помощью regex? Какие-либо указатели?

До сих пор я пробовал это, но это не работает:

 "/key2=([^amp;]*)/"
  

Комментарии:

1. Пожалуйста, покажите весь соответствующий код.

2. Подсказка: вам не нужно / , "key2=([^amp;]*)" возможно, это все, что вам нужно.

3. Спасибо, что сработало.

4. Я опубликовал ответ ниже, пожалуйста, подумайте о принятии.

Ответ №1:

Вот способ сопоставить то, что вам нужно, используя match и не привязанное регулярное выражение:

 var str = "key1=value1amp;key2=value2amp;key3=value3"
val pattern = """key2=([^amp;]*)""".r.unanchored
val res = str match {
   case pattern(res) => println(res)
   case _ => "No match"
}
  

Посмотрите эту демонстрацию

Обратите внимание, что внутри match шаблон привязан по умолчанию, и чтобы найти совпадение в любом месте строки, вы должны создать свой шаблон .unanchored .

Ответ №2:

Вы также можете обойтись без регулярных выражений. Сначала разделите с помощью amp; , а затем с помощью =

 str.replaceAll("\s ", "").split("amp;")
.map { str => 
  val Array(a, b) = str.split("=") 
  a -> b 
}.toMap.get("key2")
  

Scala REPL

 scala> str.replaceAll("\s ", "").split("amp;").map { str => val Array(a, b) = str.split("="); a -> b }.toMap.get("key2")
res23: Option[String] = Some("value2")
  

Ответ №3:

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

 ^.*?key1=(. ?)(amp;.*?)*$
^.*?key2=(. ?)(amp;.*?)*$
^.*?key3=(. ?)(amp;.*?)*$
...
  

Это зависит от того, что amp; нигде не отображается в вашем values . Вы можете поэкспериментировать с ним еще немного — regex101 ссылка

Теперь давайте перейдем к требуемому Scala,

 def findValueForKeyI(i: Int, str: String): Option[String] = {
  val regex = ("^.*?key"   i   "=(. ?)(amp;.*?)*$").r
  val matcher = regex.pattern.matcher(str)
  matcher.matches match {
    case true => Some(matcher.group(1))
    case _ => None
  }
}
  

Теперь давайте попробуем в консоли Scala,

 scala> :pa
// Entering paste mode (ctrl-D to finish)

def findValueForKeyI(i: Int, str: String): Option[String] = {
  val regex = ("^.*?key"   i   "=(. ?)(amp;.*?)*$").r
  val matcher = regex.pattern.matcher(str)
  matcher.matches match {
    case true => Some(matcher.group(1))
    case _ => None
  }
}

// Exiting paste mode, now interpreting.

findValueForKeyI: (i: Int, str: String)Option[String]

scala> val str = "key1=value1amp;key2=value2amp;key3=value3"
str: String = key1=value1amp;key2=value2amp;key3=value3

scala> findValueForKeyI(1, str)
res24: Option[String] = Some(value1)

scala> findValueForKeyI(2, str)
res25: Option[String] = Some(value2)

scala> findValueForKeyI(3, str)
res26: Option[String] = Some(value3)

scala> findValueForKeyI(4, str)
res27: Option[String] = None