日期:2014-05-20  浏览次数:20681 次

(高难度字符串处理)如何把如下字符串:“所困多幅#112哭诉大892”中的数字892提取出来
如何把如下字符串:“所困多幅#112哭诉大892”中的数字892提取出来。
其中892不一定就是这几个数字,可以是任意0-9的数字,位数也不确定,但这个几个数字之间一定没有其他字符。前面的112不需要取出来。但是前面的112也是不确定的数字,位数也不确定,但是他的前面一定有个#。现在就是要怎么样才能把这个892这个位置上的数字取出来。
字符串举例:所困多幅#112哭诉大892
算幅#22锁诉大3222
锁定#4大330

现在就是怎么把这样的字符串中的892,3222,330取出来。



------解决方案--------------------
String str = "算幅#22锁诉大3222所困多幅#112哭诉大892 ";
Pattern p = Pattern.compile( "(? <!#|\\d)\\d+ ");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group());
}
------解决方案--------------------
(\\d)+(Y|K)*
------解决方案--------------------
规则就是:

1数字+K 或 1数字+Y 或 n数字 ,对吗?

正则表达式可以(有好多种可匹配的方式)是:

\d(K|Y|\d+)
String p= "\\d(K|Y|\\d+) ";
------解决方案--------------------
String str = "120kV所困2Y多2K幅#11哭诉大892 ";
String pat = "(\\d+[kK][vV]|\\d[KY]|(? <!#)\\d{2,}) ";
Pattern p = Pattern.compile(pat);
Matcher m = p.matcher(str);

while(m.find()){
System.out.println(m.group(1));

}
---------------------------------
就能想到这里了,你再把带kv的去掉.

期待好的解决方法.
------解决方案--------------------
//昏,不明白你要什么,随便写了一个。不当之处请高手赐教 :)
//+换成{1,n}可将ky前面数字限制为n位以内。若只要ky大写将前面两处:[yY]和[Kk]改为Y和K即可
String str = "厄220kV算2Kv幅2K啊22K#22抗22击2Y非333典2y声22Y卡锁诉2大32 ";
Pattern p = Pattern.compile( "(? <!#|\\d)(?:\\d+(?:[yY]|[Kk](?![vV])))|\\d{3,}(?![kK][vV]) ");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group());
}
------解决方案--------------------
再改一下。其他需求,按我上面的说明改就行了
Pattern p = Pattern.compile( "(? <!#|\\d)(?:(?:\\d+(?:[yY]|[Kk](?![vV])))|\\d{3,}(?![kK][vV])) ");