见《java字符串解析》,联想

本文介绍了一个使用正则表达式简化字符串处理的例子。通过Ruby及Java实现,将具有相同数字前缀且相邻的数据项进行分组,并用分号隔开。这种方法适用于具有一定规律性的输入字符串。
JavaEye问答:[url=http://www.iteye.com/problems/8342]java字符串解析[/url]

本来想回那帖的,但从学校坐了趟公交回到住处那问题就已经关闭了 T T
其实我是想说,这问题用正则表达式解决是如此的简单……因为那帖给的字符串是有规律的:[b]带有相同数字的项是相邻的[/b]。

例如说用Ruby的话,在irb里测试一下:
irb(main):001:0> src = '22:w,22:c,21:r,7:r,7:w,7:c,8:w,8:c,8:d,9:r,9:w,9:c,9:d,10:r'
=> "22:w,22:c,21:r,7:r,7:w,7:c,8:w,8:c,8:d,9:r,9:w,9:c,9:d,10:r"
irb(main):002:0> re = /((\d+):\w(,\2:\w)*),/
=> /((\d+):\w(,\2:\w)*),/
irb(main):003:0> expected_result = '22:w,22:c;21:r;7:r,7:w,7:c;8:w,8:c,8:d;9:r,9:w,9:c,9:d;10:r'
irb(main):004:0> result = src.gsub re, '\1;'
=> "22:w,22:c;21:r;7:r,7:w,7:c;8:w,8:c,8:d;9:r,9:w,9:c,9:d;10:r"
irb(main):005:0> result == expected_result
=> true


也就是说那个问题用一行代码的函数就能解决:
def reformat(src)
src.gsub /((\d+):\w(,\2:\w)*),/, '\1;'
end


即便用Java也仍然是同样的简单:
public class TestRegex {
public static String reformat(String src) {
return src.replaceAll("((\\d+):\\w(,\\2:\\w)*),", "$1;");
}

public static void main(String[] args) {
String src = "22:w,22:c,21:r,7:r,7:w,7:c,8:w,8:c,8:d,9:r,9:w,9:c,9:d,10:r";
String expected = "22:w,22:c;21:r;7:r,7:w,7:c;8:w,8:c,8:d;9:r,9:w,9:c,9:d;10:r";
String result = reformat(src);
System.out.println(result.equals(expected));
}
}


当然如果输入的字符串没有上述的特殊属性就无法保证这个方法的正确性了。只不过我猜那个问题原本作为源的字符串就是从什么别的程序输出得到的,或许本来就有这样的规律,值得利用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值