正则表达式从String中提取最后一个数字

时间:2014-06-05 14:24:35

标签: java regex

我有一些索引并且是动态的字符串。 例如:

name01,
name02,
name[n]

现在我需要将名称与索引分开。 我已经提出了这个正则表达式,它可以提取索引。

([0-9]+(?!.*[0-9]))

但是,这些名称有一些例外。其中一些可能附加了一个不是索引的数字。(这些字符串是有限的,我知道它们,这意味着我可以将它们添加为&#34;异常&#34;在正则表达式中) < / p>

例如,

panLast4[01]

这里最后一个&#39; 4&#39;不是索引的一部分,所以我需要区分。 所以我试过了:

[^panLast4]([0-9]+(?!.*[0-9]))

适用于panLast4[123]但适用于panLast4[43]

注意:&#34; [&#34;和&#34;]&#34;仅用于说明目的,字符串中不存在

有什么问题?

由于

1 个答案:

答案 0 :(得分:2)

您可以使用此模式的split方法:

(?<!^panLast(?=4)|^nm(?=14)|^nm1(?=4))(?=[0-9]+$)

我们的想法是找到有数字的位置,直到字符串(?=[0-9]+$)结束。但如果负面的lookbehind允许它(以排除以数​​字结尾的特定名称​​(panLast4nm14,匹配将成功。当找到其中一个特定名称时,正则表达式引擎必须转到下一个位置才能获得匹配。

示例:

String s ="panLast412345";
String[] res = s.split("(?<!^panLast(?=4)|^nm(?=14)|^nm1(?=4))(?=[0-9]+$)", 2);
if ( res.length==2 ) {
    System.out.println("name: " + res[0]);
    System.out.println("ID: " + res[1]); 
}

matches()的另一种方法,它只使用惰性量词作为最后一种选择:

Pattern p = Pattern.compile("(panLast4|nm14|.*?)([0-9]+)");
String s = "panLast42356";
Matcher m = p.matcher(s);
if ( m.matches() && m.group(1).length()>0 ) {
    System.out.println("name: "+ m.group(1));
    System.out.println("ID: "+ m.group(2));
}