无法使用正则表达式

时间:2018-05-30 09:02:40

标签: regex scala

我有一个看起来像"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 :(得分:5)

您可以使用该正则表达式:

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:并将值添加到第一个;在一个小组

答案 1 :(得分:4)

您可以将正则表达式更新为

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

Demo

答案 2 :(得分:2)

如果你想得到第一个匹配(因为字符串中总会有一个匹配),使用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:和ID本身之间的可选空格而不受限制):

val personIdRegex = """PersonId:\s*([^;]+)""".r.unanchored
val personIdExtracted = str match {
  case personIdRegex(person_id) => person_id
  case _ => ""
}

请参阅this Scala demo

这里,.unanchored使模式匹配字符串内的部分子串,正则表达式中的([^;]+)形成一个捕获组,可以通过match块内的任意名称引用(我选择person_id)。

答案 3 :(得分:0)

如果你想捕捉 的 fruhdHH $ $ skdjJIFROfUB3djeggG TT 来自&#34; bla bla bla PersonId:fruhdHH $ skdjJIFROfUB3djeggG $ tt; bla bla bla&#34;

您可以使用此模式:&#34;。* PersonId:(。*);&#34; 这将捕获组1中的所需值。

这种模式可以通过以下方式解决:

。* PersonId::这是为了匹配任何模式,以及#34; PersonId:&#34;

(。*); :这是为了捕获第一组中的任何一系列字符,直到a;遇到了

答案 4 :(得分:0)

您可以使用以下内容。

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));
    }