java - 正则表达式从字符串中提取最后一个数字

标签 java regex

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

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]+$)结尾处有数字的位置。但是,如果负向后查找允许,则匹配将会成功(排除以数字结尾的特定名称​​(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));
}

关于java - 正则表达式从字符串中提取最后一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24062782/

相关文章:

java - Jms在swing应用程序中发送消息时的最佳实践?

javascript - 使用 Javascript 验证以 256 开头的电话号码时出现问题

java - 如何选择包含前一个单词的单词?

c# - RxExp 匹配第一个标签

r - 数据框上的 gsubfn

java对象在多个线程之间共享,何时垃圾收集?

java - Hibernate 4.1.9 c3p0 设置,以及与数据库的连接方式太多

java - 像 grapes/maven/ivy 这样的工具的远程依赖管理器如何设法利用相同的底层存储库......?

java - 如何使用 Spring Data JPA 删除子记录

c# - 正则表达式能做到这一点吗?