问两个正则表达式

liangCK 2009-07-29 04:02:41
数据:

1985aaa1985bb
bcae1958fiefadf1955fef
atijc1944cvkd
df2564isdjfef2564d

实现1:匹配第一次出现的四个数字.然后后面也存在这四个数字的
如:
1985aaa1985bb
第一次出现的四个数字是1985.然后后面也存在这四个数字,所以这个匹配
bcae1958fiefadf1955fef
第一次出现的四个数字是1958.然后后面不存在这四个数字.所以不匹配
-----
所以实现1.应该匹配
1985aaa1985bb
df2564isdjfef2564d


实现2:匹配第一次出现的四个数字.然后后面不存在这四个数字的
如:
1985aaa1985bb
第一次出现四个数字是1985.然后后面也出现1985,所以不匹配.
atijc1944cvkd
第一次出现1944.然后后面没有出现1944.所以匹配
-----
所以实现2,应该匹配
bcae1958fiefadf1955fef
atijc1944cvkd
...全文
507 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
十八道胡同 2009-07-30
  • 打赏
  • 举报
回复
强大!
liangCK 2009-07-30
  • 打赏
  • 举报
回复
谢谢过客.已经完全满足了..
-过客- 2009-07-30
  • 打赏
  • 举报
回复
仔细看了一下,需求还有一点需要明确的,因为需求不同,写出的正则也不同
是验证第一个出现的连续4个数字是否有重复,还是任意位置出现的连续4个数字是否有重复,比如以下字符串
abc1234def5678ghi5678jkl
验证的结果应该是true还是false?

//如果是验证第一个出现的连续4个数字是否有重复
string[] test = new string[] { "1985aaa1985bb", "bcae1958fiefadf1955fef", "atijc1944cvkd", "df2564isdjfef2564d", "abc1234def5678ghi5678jkl" };
Regex reg = new Regex(@"^(?:(?!\d{4}).)*(\d{4})(?:(?!\1).)*\1");
foreach (string s in test)
{
richTextBox2.Text += "源字符串: " + s.PadRight(25, ' ') + "验证结果: " + reg.IsMatch(s) + "\n";
}
//输出
源字符串: 1985aaa1985bb 验证结果: True
源字符串: bcae1958fiefadf1955fef 验证结果: False
源字符串: atijc1944cvkd 验证结果: False
源字符串: df2564isdjfef2564d 验证结果: True
源字符串: abc1234def5678ghi5678jkl 验证结果: False


//如果是验证任意位置出现的连续4个数字是否有重复,可以用我38楼的正则
string[] test = new string[] { "1985aaa1985bb", "bcae1958fiefadf1955fef", "atijc1944cvkd", "df2564isdjfef2564d", "abc1234def5678ghi5678jkl" };
Regex reg = new Regex(@"(\d{4})(?:(?!\1).)*\1");
foreach (string s in test)
{
richTextBox2.Text += "源字符串: " + s.PadRight(25, ' ') + "验证结果: " + reg.IsMatch(s) + "\n";
}
//输出
源字符串: 1985aaa1985bb 验证结果: True
源字符串: bcae1958fiefadf1955fef 验证结果: False
源字符串: atijc1944cvkd 验证结果: False
源字符串: df2564isdjfef2564d 验证结果: True
源字符串: abc1234def5678ghi5678jkl 验证结果: True


无论对于哪一种规则,第二个需求都可以通过对第一个需求的匹配结果取反获得

当然,对于验证第一个出现的连续4个数字是否有重复这种规则,可以在正则中实现逻辑判断
string[] test = new string[] { "1985aaa1985bb", "bcae1958fiefadf1955fef", "atijc1944cvkd", "df2564isdjfef2564d", "abc1234def5678ghi5678jkl" };
Regex reg = new Regex(@"^(?:(?!\d{4}).)*(\d{4})(?:(?!\1).)*$");
foreach (string s in test)
{
richTextBox2.Text += "源字符串: " + s.PadRight(25, ' ') + "验证结果: " + reg.IsMatch(s) + "\n";
}
//输出
源字符串: 1985aaa1985bb 验证结果: False
源字符串: bcae1958fiefadf1955fef 验证结果: True
源字符串: atijc1944cvkd 验证结果: True
源字符串: df2564isdjfef2564d 验证结果: False
源字符串: abc1234def5678ghi5678jkl 验证结果: True


但是对于验证任意位置出现的连续4个数字是否有重复这种规则,第二个需求想在正则中判断还是很困难的,也没有必要,直接取反就可以了
-过客- 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 liangck 的回复:]
强大.
[/Quote]

38楼是否满足需求
liangCK 2009-07-29
  • 打赏
  • 举报
回复
强大.
-过客- 2009-07-29
  • 打赏
  • 举报
回复
是用作验证吗?

//第一个需求
string[] test = new string[] { "1985aaa1985bb", "bcae1958fiefadf1955fef", "atijc1944cvkd", "df2564isdjfef2564d" };
Regex reg = new Regex(@"(\d{4})(?:(?!\1).)*\1");
foreach (string s in test)
{
richTextBox2.Text += "源字符串: " + s.PadRight(25, ' ') + "验证结果: " + reg.IsMatch(s) + "\n";
}
//输出
源字符串: 1985aaa1985bb 验证结果: True
源字符串: bcae1958fiefadf1955fef 验证结果: False
源字符串: atijc1944cvkd 验证结果: False
源字符串: df2564isdjfef2564d 验证结果: True



//第二个需求最简单的就是把第一个需求的结果做取反操作了
string[] test = new string[] { "1985aaa1985bb", "bcae1958fiefadf1955fef", "atijc1944cvkd", "df2564isdjfef2564d" };
Regex reg = new Regex(@"(\d{4})(?:(?!\1).)*\1");
foreach (string s in test)
{
richTextBox2.Text += "源字符串: " + s.PadRight(25, ' ') + "验证结果: " + !reg.IsMatch(s) + "\n";
}
//输出
源字符串: 1985aaa1985bb 验证结果: False
源字符串: bcae1958fiefadf1955fef 验证结果: True
源字符串: atijc1944cvkd 验证结果: True
源字符串: df2564isdjfef2564d 验证结果: False
liangCK 2009-07-29
  • 打赏
  • 举报
回复
up
mawering 2009-07-29
  • 打赏
  • 举报
回复
学习一下!
lsd123 2009-07-29
  • 打赏
  • 举报
回复
.
zjyaoo 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 zjyaoo 的回复:]
引用 28 楼 lcl_data 的回复:
引用 22 楼 zjyaoo 的回复:
这个怎么解决呢?
key△name⊙defg⊙sdfdsfsd⊙
怎么用正则怎么取以key△开头, 以第一个⊙结尾的中间字符,上面的例子应该是取到name

"key△[^⊙]*.*"

没有取到
group[0]是"key△name⊙defg⊙sdfdsfsd⊙"
group[1]是""
[/Quote]
谁来帮我一下
Coding_Playing_Boy 2009-07-29
  • 打赏
  • 举报
回复
你的4个数字不确定的话,你可以动态筛选,用正则匹配你需要的四个数,然后判断这4个数重复出现的次数,如果count>1 匹配的字符串出现多次,就是第一种情况,
如果count=1 匹配的字符串出现一次,就是第二种情况,
十八道胡同 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 liangck 的回复:]
引用 29 楼 lcl_data 的回复:
引用 27 楼 liangck 的回复:
引用 25 楼 liangck 的回复:
第二个正则..如果数据是这样子呢?

atijc1944cvkd1904adf1944


只有后面还有1944就比配成功?干脆全部提取数字来比较得了


第二个正则就是先找第一次出现的4个数字.如果之后都没有出现这4个数字.就匹配成功.

如果是提取数字出来..就不用了..
主要是现在在学正则..想用一个正则写出来.
[/Quote]

占楼等过客
liangCK 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 lcl_data 的回复:]
引用 27 楼 liangck 的回复:
引用 25 楼 liangck 的回复:
第二个正则..如果数据是这样子呢?

atijc1944cvkd1904adf1944


只有后面还有1944就比配成功?干脆全部提取数字来比较得了
[/Quote]

第二个正则就是先找第一次出现的4个数字.如果之后都没有出现这4个数字.就匹配成功.

如果是提取数字出来..就不用了..
主要是现在在学正则..想用一个正则写出来.
zjyaoo 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 lcl_data 的回复:]
引用 22 楼 zjyaoo 的回复:
这个怎么解决呢?
key△name⊙defg⊙sdfdsfsd⊙
怎么用正则怎么取以key△开头, 以第一个⊙结尾的中间字符,上面的例子应该是取到name

"key△[^⊙]*.*"
[/Quote]
没有取到
group[0]是"key△name⊙defg⊙sdfdsfsd⊙"
group[1]是""
十八道胡同 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 liangck 的回复:]
引用 25 楼 liangck 的回复:
第二个正则..如果数据是这样子呢?

atijc1944cvkd1904adf1944

[/Quote]
只有后面还有1944就比配成功?干脆全部提取数字来比较得了
十八道胡同 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 zjyaoo 的回复:]
这个怎么解决呢?
key△name⊙defg⊙sdfdsfsd⊙
怎么用正则怎么取以key△开头, 以第一个⊙结尾的中间字符,上面的例子应该是取到name
[/Quote]
"key△[^⊙]*.*"
liangCK 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 liangck 的回复:]
第二个正则..如果数据是这样子呢?

atijc1944cvkd1904adf1944
[/Quote]
zjyaoo 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 lcl_data 的回复:]
引用 22 楼 zjyaoo 的回复:
这个怎么解决呢?
key△name⊙defg⊙sdfdsfsd⊙
怎么用正则怎么取以key△开头, 以第一个⊙结尾的中间字符,上面的例子应该是取到name

你的原串貌似无法赋值给string把
[/Quote]
这个是我组合的值,传到另一个页面想分解一下
liangCK 2009-07-29
  • 打赏
  • 举报
回复
第二个正则..如果数据是这样子呢?

atijc1944cvkd194adf1944
十八道胡同 2009-07-29
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 zjyaoo 的回复:]
这个怎么解决呢?
key△name⊙defg⊙sdfdsfsd⊙
怎么用正则怎么取以key△开头, 以第一个⊙结尾的中间字符,上面的例子应该是取到name
[/Quote]
你的原串貌似无法赋值给string把
加载更多回复(22)

110,534

社区成员

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

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

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