簡體   English   中英

無法使用正則表達式提取值

[英]fail to extract value using regex

我有一個strig,看起來像: "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

它不起作用,在正則表達式中非常弱的人會喜歡一些幫助:)

謝謝!

您可以使用該正則表達式:

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:並將值添加到第一個; 在一組

您可以將正則表達式更新為

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

演示版

如果要獲得第一個匹配項(因為字符串中始終有一個匹配項),則使用findFirstIn更為有意義:

"""(?<=PersonId:)[^;]+""".r.findFirstIn(str).get

(?<=PersonId:)[^;]+正則表達式表示:

  • (?<=PersonId:) -斷言在當前位置的左側緊鄰有PersonId:文本
  • [^;]+ - 1+比其它字符;

參見regex演示

參見Scala演示

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塊與未錨定的正則表達式match使用(此處,您可以不受限制地匹配PersonId:和ID本身之間的可選空格):

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

請參閱此Scala演示

在這里, .unanchored使模式匹配字符串中的部分子字符串,而正則表達式中的([^;]+)構成了一個捕獲組,該捕獲組可以由match塊內的任意名稱引用(我選擇person_id )。

如果要從“ bla bla bla PersonId:fruhdHH $ skdjJIFROfUB3djeggG $ tt; bla bla bla”捕獲fruhdHH $ skdjJIFROfUB3djeggG $ tt

您可以使用以下模式: “。* PersonId:(。*);” 這將在組1中捕獲所需的值。

可以按以下方式剖析此模式:

。* PersonId::這是要匹配任何模式匹配的“ PersonId:”

(。*); :用來捕獲第一組中的任何系列字符,直到一個; 遇到

您可以使用以下內容。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM