我有一些已索引且动态的字符串。 例如:
name01,
name02,
name[n]
现在我需要将名称与索引分开。 我想出了这个正则表达式,它可以正常提取索引。
([0-9]+(?!.*[0-9]))
但是,这些名称也有一些异常(exception)。其中一些可能附加了一个不是索引的数字。(这些字符串是有限的,我知道它们,这意味着我可以将它们添加为正则表达式中的“异常(exception)”)
例如,
panLast4[01]
这里最后一个'4'不是索引的一部分,所以我需要区分。 所以我尝试了:
[^panLast4]([0-9]+(?!.*[0-9]))
适用于 panLast4[123]
,但不适用于 panLast4[43]
注意:“[”和“]”仅用于解释目的,它不存在于字符串中
出了什么问题?
谢谢
最佳答案
您可以将 split 方法与此模式一起使用:
(?<!^panLast(?=4)|^nm(?=14)|^nm1(?=4))(?=[0-9]+$)
这个想法是找到直到字符串(?=[0-9]+$)
结尾处有数字的位置。但是,如果负向后查找允许,则匹配将会成功(排除以数字结尾的特定名称(panLast4
和 nm14
))。当找到这些特定名称之一时,正则表达式引擎必须转到下一个位置以获得匹配项。
示例:
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));
}
关于java - 正则表达式从字符串中提取最后一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24062782/