两个字符串相比较,如何找出第一个不相同的部分?

slin60 2008-09-08 04:18:34
找出两个字符串第一个不相同的部分
例:str1: abc123aacc
str2: abc4567aabb

则结果:123 4567

这个问题能用正则解决吗?请大哥帮忙
...全文
637 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
LovingAlison 2008-09-08
  • 打赏
  • 举报
回复
用程序写还会 用正则就不会啦
slin60 2008-09-08
  • 打赏
  • 举报
回复
恩,好的,谢谢了
王集鹄 2008-09-08
  • 打赏
  • 举报
回复
直接遍历字符的速度快,正则只是容易扩展复杂的判断。。。(当然效率相差在毫秒这个级别)

如果数据量在万这个数量级,字符串的长度在千这个数量级,基本不用考虑效率,现在的计算机都很快。。。

具体看测试的结果,,,偶向来都是以测试的结果说话。

slin60 2008-09-08
  • 打赏
  • 举报
回复
还有请教一下zswang 大哥,你说我这种情况用遍历字符的速度快还是你那个正则的方法速度快?正则我不怎么熟悉

晚上结贴,先放一会~~~
cheng_er 2008-09-08
  • 打赏
  • 举报
回复
不喜欢用正则
slin60 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 xiaojian 的回复:]
引用 6 楼 slin60 的回复:
我主要是想根据文件名中的数字,自动从小到大排序:例如:a1.jpg、a2.jpg、---------a11.jpg,
而不是a1.jpg、a11.jpg、a2.jpg..............

同样的道理,如果两个文件名之间只有数值的差别,而且位置相同,则以数字的顺序排列


  如果你只是考虑数值的差别,可以先用“空格”把非数字型的其它字符替换掉,然后用trim去掉最前面的空格,接着以“空格”为分隔符Split出一个数组T(),比较…
[/Quote]

关键是还是需要考虑非数值啊

何况这个是要实现IComparer接口的,算法不能整得太复杂,文件一多速度就会很慢了
slin60 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 zswang 的回复:]
问到偶,那偶就重在参与。。。

C# codeprivate void button1_Click(object sender, EventArgs e)
{
string[] str = { "a1a.jpg", "a11a.jpg", "a12a.jpg", "a12b.jpg", "a7a.jpg" };

Array.Sort(str, delegate (string a, string b)
{
while (a != b)
{
string ta = Regex.Match(a, @"^[^\d]*").Value;
string tb = Regex.Match(b, @"^…
[/Quote]

谢谢!
王集鹄 2008-09-08
  • 打赏
  • 举报
回复
问到偶,那偶就重在参与。。。
private void button1_Click(object sender, EventArgs e)
{
string[] str = { "a1a.jpg", "a11a.jpg", "a12a.jpg", "a12b.jpg", "a7a.jpg" };

Array.Sort(str, delegate (string a, string b)
{
while (a != b)
{
string ta = Regex.Match(a, @"^[^\d]*").Value;
string tb = Regex.Match(b, @"^[^\d]*").Value;
if (ta != tb) return string.Compare(ta, tb);
a = Regex.Replace(a, @"^[^\d]*", "");
b = Regex.Replace(b, @"^[^\d]*", "");
ta = Regex.Match(a, @"^\d*").Value;
tb = Regex.Match(b, @"^\d*").Value;
double fa;
double fb;
double.TryParse(ta, out fa);
double.TryParse(tb, out fb);
if (fa != fb)
return Comparer<double>.Default.Compare(fa, fb);
a = Regex.Replace(a, @"^\d*", "");
b = Regex.Replace(b, @"^\d*", "");
}
return 0;
}
);
foreach (string s in str)
Console.WriteLine(s);
}


---输出----
a1a.jpg
a7a.jpg
a11a.jpg
a12a.jpg
a12b.jpg
飞天神笔 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 slin60 的回复:]
我主要是想根据文件名中的数字,自动从小到大排序:例如:a1.jpg、a2.jpg、---------a11.jpg,
而不是a1.jpg、a11.jpg、a2.jpg..............

同样的道理,如果两个文件名之间只有数值的差别,而且位置相同,则以数字的顺序排列
[/Quote]

  如果你只是考虑数值的差别,可以先用“空格”把非数字型的其它字符替换掉,然后用trim去掉最前面的空格,接着以“空格”为分隔符Split出一个数组T(),比较数组中T(0)的值的大小,不就可以进行你要的排序了嘛。

  如果有两个(或两个以上)的T(0)的值相同,就可以比较T(1)的值的大小,依次类推。
skywolfY 2008-09-08
  • 打赏
  • 举报
回复
有一种方法,把 a001.jpg 的点前边的a001的ascII加到一起。得到数据后排序。
正则。。。好慢。
飞天神笔 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ericzhangbo1982111 的回复:]
linQ 到是很好能实现。。
[/Quote]
LINQ怎么实现?
slin60 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 silwol 的回复:]
引用 8 楼 lh2907883 的回复:
为什么不把文件名做下规定 例如:a001.jpg、a002.jpg、---------a011.jpg,

推荐这个,LZ你要解决的核心问题是排序,正则之类的只是手段。
[/Quote]


我要做的是一个类似于ftp资源管理器的东西,到底是什么文件名不是由我做主啊
silwol 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lh2907883 的回复:]
为什么不把文件名做下规定 例如:a001.jpg、a002.jpg、---------a011.jpg,
[/Quote]
推荐这个,LZ你要解决的核心问题是排序,正则之类的只是手段。
slin60 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ericzhangbo1982111 的回复:]
linQ 到是很好能实现。。
[/Quote]

可是我是用的2.0啊 我也不想弄得那么麻烦
ericzhangbo1982111 2008-09-08
  • 打赏
  • 举报
回复
linQ 到是很好能实现。。
llxzj60 2008-09-08
  • 打赏
  • 举报
回复
mark
slin60 2008-09-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wdgphc 的回复:]
你可以用正则取出各个文件名中的数字啊.

str1: abc123aacc
str2: abc4567aabb

另外,如果数字后面的字母也不同你怎么办?
[/Quote]


还是按照数字顺序排列,例如两个文件:aa12cc.jpg和aa3dd.jpg 则aa3dd.jpg排在第一
slin60 2008-09-08
  • 打赏
  • 举报
回复
遍历确实不怎么麻烦,但是总觉得没有正则简洁。
wdgphc 2008-09-08
  • 打赏
  • 举报
回复
你可以用正则取出各个文件名中的数字啊.

str1: abc123aacc
str2: abc4567aabb

另外,如果数字后面的字母也不同你怎么办?
net0003 2008-09-08
  • 打赏
  • 举报
回复
这个挺有意思,
加载更多回复(9)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧