Если вы хотите получить первое совпадение (так как в строке всегда будет одно совпадение), имеет смысл использовать findFirstIn
:
"""(?<=PersonId:)[^;]+""".r.findFirstIn(str).get
.(?<=PersonId:)[^;]+
регулярное выражение означает:
(?<=PersonId:)
- утверждать, что PersonId:
текст находится непосредственно слева от текущей позиции [^;]+
- 1+ символов кроме ;
См. regex demo .
См. Scala demo :
val str = "bla bla bla PersonId:fruhdHH$skdjJIFROfUB3djeggG$tt; bla bla bla"
val personIdRegex = """(?<=PersonId:)[^;]+""".r
val personIdExtracted = personIdRegex.findFirstIn(str).get
println(personIdExtracted)
// => fruhdHH$skdjJIFROfUB3djeggG$tt
Или, более естественным образом, используйте блок match
с неисследованным регулярным выражением (здесь вы можете сопоставить необязательный пробел между PersonId:
и самим идентификатором без ограничений):
val personIdRegex = """PersonId:\s*([^;]+)""".r.unanchored
val personIdExtracted = str match {
case personIdRegex(person_id) => person_id
case _ => ""
}
См. это демо Scala .
Здесь .unanchored
сопоставляет шаблон частичным подстрокам внутри строки, а ([^;]+)
в регулярном выражении образует группу захвата, на которую может ссылаться любойпроизвольное имя внутри блока match
(я выбрал person_id
).