Регулярное выражение для определения пары ключ-значение - PullRequest
1 голос
/ 06 марта 2020

Мне нужно создать регулярное выражение для определения пар ключ-значение, разделенных запятыми. Ключ и значение могут иметь буквы (как прописные, так и строчные), цифры, специальные символы (- _, /.). Следующее регулярное выражение работает, когда специальные символы следуют за символами c алфавита, но когда специальный символ стоит перед символами c алфавита, оно не работает. Например, «ключ1. = Значение1-; ключ2 / = значение2-» работает, но «.key1 = значение1-; ключ2 / = значение2-» не работает.

import scala.util.matching.Regex

object TestReges {
  def main(args: Array[String]): Unit = {
//val inputPattern : String= "1one-=1;two=2"
//val inputPattern : String = "-"
//val inputPattern : String= "two"
val inputPattern : String= "key1-=value1;key2=,value2."
val tagValidator:  Regex = "(?:(\\w*\\d*-*_*,*/*\\.*)=(\\w*\\d*-*_*,*/*\\.*)(?=;|$))".r
//Pattern p = Pattern.compile("(?:(^[a-z]+)=(^[a-z]+)(?=&|$))");
//Matcher m = p.matcher(input);
//System.out.println(m.groupCount());
println(tagValidator.findAllMatchIn(inputPattern).size)
//    while (m.find()) {
//      System.out.println("key="+m.group(1));
//      System.out.println("value="+m.group(2));
//    }
}  }

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Почему бы не разделить разделитель, а затем просто сопоставить все по обе стороны от =, который не является =?

//Scala code
val kvPair = "([^=]+)=([^=]+)".r

List("key1.=value1-;key2/=value2-",".key1=value1-;key2/=value2-")
  .flatMap(_.split(";"))
  .collect{case kvPair(k,v) => k -> v}
//res0: List[(String, String)] = List((key1.,value1-)
//                                  , (key2/,value2-)
//                                  , (.key1,value1-)
//                                  , (key2/,value2-))
0 голосов
/ 06 марта 2020

Почему вы хотите сделать это с помощью регулярного выражения, как указано @shmosel, почему вы не можете просто разделить его на; а затем на =? как это

val inputPattern : String= "key1-=value1;key2=,value2."
inputPattern.split(";").map{ kvStr => kvStr.split("=") match 
case Array(k, v) => (k, v)
}.toMap
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...