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,但不适用于其他两个。我认为最好的解决方案基本上是说“在最后一个冒号之后获取所有内容”,但我不确定如何。请注意,它还必须包括这些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

这个正则表达式^.*DW_AT_name.*:\s*(.+)$完成了刚刚在regexplanet上测试过的工作。

于 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 回答