猿问

如下,想要返回true表示这个QQ号码是特殊号码,反之则为普通号码?怎么解决?

一长串数字字符串大概有6到8位,判断是否符合下列规则:
AAAA类型,比如1111,111125等
ABCD类型,比如1234,12345等
DCBA类型,比如4321,54321等
ABAB类型,比如1212,121212等
AABB类型,比如1122,111222等
写一个正则表达式或方法,输入参数是一个6-8位的数字字符串,如同QQ号码,然后要判断这个QQ号码只要符合上面5项类型中的任何一项,就返回true表示这个QQ号码是特殊号码,不然就返回false表示这个QQ号码是普通号码
我知道大家的意思了,可是我还是写不出方法来,拜托了:
public bool checkNumber(string str)
{
switch (str)
case “符合第一种类型”:
break;
case “符合第二种类型”:
break;
case “符合第三种类型”:
break;
case “符合第四种类型”:
break;
case “符合第五种类型”:
break;
default:
break:
}
是C#的,求方法!

皈依舞
浏览 249回答 4
4回答

翻过高山走不出你

using System;using System.Text.RegularExpressions;using System.Windows.Forms;namespace MatchNumDemo{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){string num = this.textBox1.Text;if (IsNumericAndCkLength(num)){if (IsAAAA(num) || IsABCD(num) || IsABAB(num) || IsABAB(num)){this.label1.Text = "IsMatch!";}else{this.label1.Text = "NotMatch!";}}else{this.label1.Text = "NotMatch!";}}/// <summary>/// 由数字组成且长度在[6,8]之间/// </summary>/// <param name="num"></param>/// <returns></returns>private bool IsNumericAndCkLength(string num){if (string.IsNullOrEmpty(num) || num.Length <= 5 || num.Length >= 9){return false;}int numInt;if (int.TryParse(num, out numInt)){return true;}else{return false;}}//2222private bool IsAAAA(string num){return Regex.IsMatch(num, @"\d*(\d)\1{3}\d*", RegexOptions.IgnorePatternWhitespace);}//2345private bool IsABCD(string num){bool isAbcd = false;for (int i = 0; i < num.Length - 4; i++){if (chABCD(num, i)){isAbcd = true;break;}}return isAbcd;}private bool chABCD(string num, int idx){int ck = 1;for (int i = idx; i < num.Length - 1; i++){if (int.Parse(num[i].ToString()) + 1 == int.Parse(num[i + 1].ToString())){ck++;continue;}else{break;}}return ck >= 4;}//5432private bool IsDCBA(string num){bool isDcba = false;for (int i = 0; i < num.Length - 4; i++){if (chDCBA(num, i)){isDcba = true;break;}}return isDcba;}private bool chDCBA(string num, int idx){int ck = 1;for (int i = idx; i < num.Length - 1; i++){if (int.Parse(num[i].ToString()) - 1 == int.Parse(num[i + 1].ToString())){ck++;continue;}else{break;}}return ck >= 4;}//2626private bool IsACAC(string num){return Regex.IsMatch(num, @"\d*(\d{2,})\1\d*", RegexOptions.IgnorePatternWhitespace);}//2323private bool IsABAB(string num){bool isAbab = false;string pattern = @"\d*(\d{2,})\1\d*";Match m = Regex.Match(num, pattern, RegexOptions.IgnorePatternWhitespace);if (m.Groups.Count > 0){string matchstr = m.Groups[1].Value;bool isAb = true;for (int i = 0; i < matchstr.Length - 1; i++){if (int.Parse(matchstr[i].ToString()) + 1 == int.Parse(matchstr[i + 1].ToString())){continue;}else{isAb = false;break;}}isAbab = isAb;}return isAbab;}//3377private bool IsAACC(string num){return Regex.IsMatch(num, @"\d*(\d)\1(\d)\2\d*", RegexOptions.IgnorePatternWhitespace);}//2233private bool IsAABB(string num){bool isAabb = false;string pattern = @"\d*(\d)\1(\d)\2\d*";Match m = Regex.Match(num, pattern, RegexOptions.IgnorePatternWhitespace);if (m.Groups.Count >= 1){if (int.Parse(m.Groups[1].Value) + 1 == int.Parse(m.Groups[2].Value)){isAabb = true;}}return isAabb;}//}}

潇潇雨雨

单独使用正则无法实现,必须结合程序。正则可以解决像AAAA,ABAB,AABB这种,比如用(\d)\1{3,7}就可以捕获有连续4位以上同一数字的号码,但是对于要判断大小的情况就束手无策了。

函数式编程

用极其肯定的语气告诉你,正则做不到.请直接写程序实现.很容易写.用charAt(0)实现, 比如第一种AAAAif (s.charAt(0) == s.charAt(1) && s.charAt(0) == s.charAt(2)...){}不能用swich 做, 直接用if , 用swich 的话,还得再写个函数返回case.

泛舟湖上清波郎朗

\d{4} #AAAA类型(?:1234|2345|3456|4567|5678|6789) #ABCD类型(?:4321|5432|6543|7654|8765|9876) #DCBA类型(?:12|23|34|45|56|67|78|89){2} #ABAB类型(?:1122|2233|3344|4455|5566|6677|7788|8899) #AABB类型反正你就是数字判断,这样写的正则就够了
随时随地看视频慕课网APP
我要回答