#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