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

У меня есть стриг, который выглядит следующим образом: "bla bla bla PersonId:fruhdHH$skdjJIFROfUB3djeggG$tt; bla bla bla"

, и я хочу извлечь PersonId, поэтому в основном мне нужно все, что находится между PersonId: и ;, я сделал что-то вроде:

val personIdRegex: Regex = """PersonId:\+s;""".r
val personIdExtracted = personIdRegex.findAllIn(str).matchData.take(1).map(m => m.group(1)).mkString

это не рабочая мысль, довольно слабый в регулярных выражениях хотел бы помочь:)

спасибо!

Ответы [ 5 ]

0 голосов
/ 30 мая 2018

Вы можете использовать следующее.

String str = "bla bla bla PersonId:fruhdHH$skdjJIFROfUB3djeggG$tt; bla bla bla";
    Pattern pattern = Pattern.compile("PersonId:(.*?);");
    Matcher matcher = pattern.matcher(str);
    if (matcher.find()) {
               System.out.println(matcher.group(1));
    }
0 голосов
/ 30 мая 2018

Если вы хотите получить первое совпадение (так как в строке всегда будет одно совпадение), имеет смысл использовать 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).

0 голосов
/ 30 мая 2018

Вы можете обновить свое регулярное выражение до

PersonId:([^;]+)

В первой группе захвата не будет запятой ([^;]+)

Тогда, используя ваш код, он будет выглядеть так:

val personIdRegex: Regex = """PersonId:([^;]+)""".r
val str = "bla bla bla PersonId:fruhdHH$skdjJIFROfUB3djeggG$tt; bla bla bla"
val personIdExtracted = personIdRegex.findAllIn(str).matchData.take(1).map(m => m.group(1)).mkString
println(personIdExtracted)

Это даст вам:

fruhdHH$skdjJIFROfUB3djeggG$tt

Демо

0 голосов
/ 30 мая 2018

Если вы хотите захватить fruhdHH $ skdjJIFROfUB3djeggG $ tt из "bla bla bla PersonId: fruhdHH $ skdjJIFROfUB3djeggG $ tt; bla bla bla" .

Youможно использовать этот шаблон: ". * PersonId: (. *);" Это позволит получить требуемое значение в группе 1.

Этот шаблон может быть обнаружен следующим образом:

. * PersonId: : Это соответствует любому шаблону до "PersonId:"

(. *); : Это предназначено для захваталюбая серия символов в первой группе до;встречается

0 голосов
/ 30 мая 2018

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

String test="bla bla bla PersonId:fruhdHH$skdjJIFROfUB3djeggG$tt; bla bla bla";
    Pattern p = Pattern.compile("PersonId:([^;]+)");
    Matcher m = p.matcher(test);
    if (m.find()) {
        System.out.println(m.group(1));
    }

Найти PersonId: и добавлять значение до первого;в группе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...