以下是一些示例输入:
<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
内容。
答案 0 :(得分:7)
你不需要正则表达式:
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
。 (编辑答案)
答案 1 :(得分:0)
此正则表达式^.*DW_AT_name.*:\s*(.+)$
完成了刚刚在regexplanet上测试的工作。
答案 2 :(得分:0)
String type = str.replaceAll(".*:(?=[^:]+$)", "");
答案 3 :(得分: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