簡體   English   中英

在字符串中搜索鍵值對

[英]Search for key-value pair in string

我有一個具有以下內容的Java字符串:

Response: Success
Message: Extension Status
Exten: 1234
Context: from-sip
Hint: DS/5678
Status: 9

我想在此字符串中搜索鍵"Exten:""Status:"並檢索相應的值,即"1234""9" 最好的方法是什么?

您可以使用正則表達式來獲取它們( Pattern類,帶有MULTILINE標志flor簡單性):

import java.util.regex.*;
public class RegexStrings {
    public static void main(String[] args) {
        String input = "Response: Success\n"+
                        "Message: Extension Status\n"+
                        "Exten: 1234\n"+
                        "Context: from-sip\n"+
                        "Hint: DS/5678\n"+
                        "Status: 9";
        String exten = null;
        String status = null;

        Matcher m = Pattern.compile("^Exten: (.+?)$", Pattern.MULTILINE).matcher(input);
        if (m.find()) {
            exten = m.group(1);
        }
        Matcher m2 = Pattern.compile("^Status: (.+?)$", Pattern.MULTILINE).matcher(input);
        if (m2.find()) {
            status = m2.group(1);
        }
        System.out.println("Exten: "+exten);
        System.out.println("Status: "+status);
    }
}

輸出:

Exten: 1234
Status: 9

在線演示在這里。


如果您的字符串具有固定格式,則可以使用String#substring()的組合,這可能更容易理解:

public static void main(String[] args) {
    String input = "Response: Success\n"+
                    "Message: Extension Status\n"+
                    "Exten: 1234\n"+
                    "Context: from-sip\n"+
                    "Hint: DS/5678\n"+
                    "Status: 9";

    String exten = input.substring(input.indexOf("Exten: ")+"Exten: ".length(), input.indexOf("Context: ")).trim();
    String status = input.substring(input.indexOf("Status: ")+"Status: ".length(),input.length()).trim();

    System.out.println("Exten: "+exten);
    System.out.println("Status: "+status);
}

(輸出相同)

此處的子字符串示例在線演示

您可以使用Regex的用法最少的String.split()方法。 以下是通用代碼,可將給定的輸入轉換為Map,以方便地編程方式訪問鍵值對:

import java.util.Map;
import java.util.TreeMap;

public class NameValueCreator {

    public static void main(String[] args) {

        String input = "Response: Success\nMessage: Extension Status\nExten: 1234\nContext: from-sip\nHint: DS/5678\nStatus: 9";
        System.out.println(input);

        //Convert given input to Map
        Map<String, String> nameValuePairs = convertToMap(input);


        System.out.println("------------- converted map -----------------");
        System.out.println(nameValuePairs);

    }

    public static Map<String, String> convertToMap(String input) {
        Map<String, String> nameValuePairs = new TreeMap<String, String>();
        //Split by newline to split the input into lines, where each line represents one key value pair
        String[] nameValueStrings = input.split("\\n");
        for (String nameValueString : nameValueStrings) {
            //Split by colon followed by space
            String[] nameAndValue = nameValueString.split(": ");
            nameValuePairs.put(nameAndValue[0].trim(), nameAndValue[1].trim());
        }
        return nameValuePairs;
    }

}

這是上面程序的輸出:

Response: Success
Message: Extension Status
Exten: 1234
Context: from-sip
Hint: DS/5678
Status: 9
------------- converted map -----------------
{Context=from-sip, Exten=1234, Hint=DS/5678, Message=Extension Status, Response=Success, Status=9}

不知道您是否真的要使用“:”作為關鍵字(例如Exten:一部分進行搜索,如果是這樣,則替換nameValueString.split(": "); nameValueString.split(" ");

這會起作用

 public static void main(String args[]) {
    String read = "Response: Success\n" +
            "Message: Extension Status\n" +
            "Exten: 1234\n" +
            "Context: from-sip\n" +
            "Hint: DS/5678\n" +
            "Status: 9";
    String[] arr;
    arr = read.split("\n");
    for (String i : arr) {
        if (i.contains("Exten:") || i.contains("Status:")) {
            System.out.println(i.split(" ")[1]);
        }
    }
}

Java屬性類具有用於此類名稱值對的內置解析器,該名稱值對以新行終止。 我們可以做這樣的事情:

屬性p = properties.load(new ByteArrayInputStream(xxx ...); P.getProperty(您的鍵);

這將使您的代碼小巧易讀。

暫無
暫無

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

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