我有一些索引并且是动态的字符串。 例如:
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;仅用于说明目的,字符串中不存在
有什么问题?
由于
答案 0 :(得分:2)
您可以使用此模式的split方法:
(?<!^panLast(?=4)|^nm(?=14)|^nm1(?=4))(?=[0-9]+$)
我们的想法是找到有数字的位置,直到字符串(?=[0-9]+$)
结束。但如果负面的lookbehind允许它(以排除以数字结尾的特定名称(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));
}