次の内容の Java 文字列があります。
Response: Success
Message: Extension Status
Exten: 1234
Context: from-sip
Hint: DS/5678
Status: 9
"Exten:"
この文字列でキーを"Status:"
検索し、対応する値、つまり"1234"
andを取得したいと思います"9"
。これを行う最善の方法は何ですか?
次の内容の Java 文字列があります。
Response: Success
Message: Extension Status
Exten: 1234
Context: from-sip
Hint: DS/5678
Status: 9
"Exten:"
この文字列でキーを"Status:"
検索し、対応する値、つまり"1234"
andを取得したいと思います"9"
。これを行う最善の方法は何ですか?
Regex を使用してそれらを取得できます ( Pattern
class、MULTILINE
フラグ flor simples を使用):
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);
}
(同じ出力)
これはうまくいきます
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]);
}
}
}
正規表現の使用を最小限に抑えて 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(" ");