0

入力例を次に示します。

<210>   DW_AT_name        : (indirect string, offset: 0x55): double
 <ae>   DW_AT_name        : (indirect string, offset: 0x24): long int
 <b5>   DW_AT_name        : int

実際の型を表す文字列を抽出したい。したがって、私の出力は次のようになります。

double
long int
int

これは私がこれまでに持っている正規表現です(Javaにあるため二重エスケープされています):

.*DW_AT_name.*:\\s*([^:&&\\S]*)\\s*

には機能しますintが、他の 2 つには機能しません。基本的に「最後のコロンの後にすべてを取得する」と言うのが最善の解決策だと思いますが、その方法はわかりません。も含まれている必要があることに注意してくださいDW_AT_NAME

4

4 に答える 4

8

これには正規表現は必要ありません:

String yourString = "<210>   DW_AT_name        : (indirect string, offset: 0x55): double";
String result;
if (yourString.contains("DW_AT_name")) {
    int lastIndex = yourString.lastIndexOf(":");
    result = yourString.substring(lastIndex + 1).trim();
} else {
    result = "ERROR"; // or handle this however you want
}
System.out.println(result);

単に最後のものを見つけて、:それ以降のすべてを取ります。次に、先頭と末尾の空白を削除するようにトリミングします。

質問を編集しました。DW_AT_name も確認する必要があります。文字列の分割は[原文のまま]それをしません。

を使用するだけcontainsです。(編集された回答)

于 2013-06-27T23:05:15.647 に答える
0

この正規表現は、 regexplanet^.*DW_AT_name.*:\s*(.+)$でテストしたばかりのように機能します。

于 2013-06-27T23:06:42.957 に答える
0

次を試してください。

public static void main(String[] args) {

    String text = 
    "<210>   DW_AT_name        : (indirect string, offset: 0x55): double\n" + 
    "<ae>   DW_AT_name        : (indirect string, offset: 0x24): long int\n" + 
    "<b5>   DW_AT_name        : int";

    Pattern pattern = Pattern.compile("^.*DW_AT_NAME.*:\\s*([^:]+)$", 
            Pattern.CASE_INSENSITIVE);

    Scanner sc = new Scanner(text);
    while(sc.hasNextLine()) {
        String line = sc.nextLine();
        Matcher matcher = pattern.matcher(line);
        if (matcher.matches()) {
            System.out.println(matcher.replaceAll("$1"));
        }
    }

}

出力:

double
long int
int
于 2013-06-27T23:20:58.713 に答える
0
String type = str.replaceAll(".*:(?=[^:]+$)", "");
于 2013-06-27T23:11:21.813 に答える