最近在做一个关于控件集设计的项目,总体感觉很有趣,也学到了很多东西。
为了使这点东西对我以后有点帮助,我不惜在上班时候小小抽出一点时间来做一下笔记。
1 在写Textbox控件的共通方法时候,看到了3个需求,前2个是输入的值验证,
第一个验证是,输入值得值是否允许输入,第二个验证是,输入值是否不允许输入。第三个是
利用正则表达式,验证输入的值。刚开始我比较迷茫,因为我的想法来看,
3个需求完全可以由一个bool CheckXXX(String regexp,String Value)来解决。
于是我向上级发了Q&A,也正是由于这个Q&A让我懂了很多知识。虽然从技术层面上,
这3个控制都可以由正则表达式来实现。
比如:
StringUtil.CheckCharsInputable("abcde", value)
和
StringUtil.CheckFormat("[abcde]*", value)
其实可以做一样的事情。但是面向的使用对象不同。对于正则表现理解比较深的人可以这样。
但也存在正则用的不是很好地,或者不会者。这就大大的增加了程序出BUG的机会。所以为了避免
这样的情况发生,我们宁可在开发阶段来避免。
例如
在写StringUtil.CheckCharsUninputable(",/"", value)
(不能输入「,」和「"」的验证)
的时候、就有可能会发生重大BUG的可能性。
由于开发者的正则理解错误方法变成了
StringUtil.CheckFormat("[,/"]", value)
这样不就引起了错误么。
从性能方面考虑,
一般单纯的对文字的验证会远远比用正则表达式的时候情况多,
加上对于文字的验证,利用数组迭代的方法来做比用正则来实现效率要快的多。
例:文字验证与入力格式验证的比率为9:1的时候
<各种处理的时间用例>
验证文字(用数组迭代实现) 1ms
验证格式(用正则实现) 10ms
・都用正则实现的场合
1ms × 90回 + 10ms × 10回 ⇒ 190ms
・验证文字用数组,验证格式用正则的时候
10ms × 90回 + 10ms × 10回 ⇒ 1000ms
虽然这个数据不确切 但是从真正意义上,
用其他方法要比用正则来实现要好这一点是没错的
所以最终把我说服了。但是前面的那个理由接受起来其实还是比较容易的,
为了使这点东西对我以后有点帮助,我不惜在上班时候小小抽出一点时间来做一下笔记。
1 在写Textbox控件的共通方法时候,看到了3个需求,前2个是输入的值验证,
第一个验证是,输入值得值是否允许输入,第二个验证是,输入值是否不允许输入。第三个是
利用正则表达式,验证输入的值。刚开始我比较迷茫,因为我的想法来看,
3个需求完全可以由一个bool CheckXXX(String regexp,String Value)来解决。
于是我向上级发了Q&A,也正是由于这个Q&A让我懂了很多知识。虽然从技术层面上,
这3个控制都可以由正则表达式来实现。
比如:
StringUtil.CheckCharsInputable("abcde", value)
和
StringUtil.CheckFormat("[abcde]*", value)
其实可以做一样的事情。但是面向的使用对象不同。对于正则表现理解比较深的人可以这样。
但也存在正则用的不是很好地,或者不会者。这就大大的增加了程序出BUG的机会。所以为了避免
这样的情况发生,我们宁可在开发阶段来避免。
例如
在写StringUtil.CheckCharsUninputable(",/"", value)
(不能输入「,」和「"」的验证)
的时候、就有可能会发生重大BUG的可能性。
由于开发者的正则理解错误方法变成了
StringUtil.CheckFormat("[,/"]", value)
这样不就引起了错误么。
从性能方面考虑,
一般单纯的对文字的验证会远远比用正则表达式的时候情况多,
加上对于文字的验证,利用数组迭代的方法来做比用正则来实现效率要快的多。
例:文字验证与入力格式验证的比率为9:1的时候
<各种处理的时间用例>
验证文字(用数组迭代实现) 1ms
验证格式(用正则实现) 10ms
・都用正则实现的场合
1ms × 90回 + 10ms × 10回 ⇒ 190ms
・验证文字用数组,验证格式用正则的时候
10ms × 90回 + 10ms × 10回 ⇒ 1000ms
虽然这个数据不确切 但是从真正意义上,
用其他方法要比用正则来实现要好这一点是没错的
所以最终把我说服了。但是前面的那个理由接受起来其实还是比较容易的,
但是后面那个效率性的说明,就小小有点不服,我就写了一个程序小小测试一下。
下面贴个小小代码。我是才毕业的学生,写出代码质量比较差,请各位大大包含。主要还是留给我以后自己YY的
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Text.RegularExpressions;
- using System.Runtime.InteropServices;
- namespace ConsoleApplication4
- {
- class Class2
- {
- static void Main(string[] args)
- {
- Console.WriteLine("this is a test for testing the efficiency of three method:");
- Console.WriteLine("Target:check the uninputChar");
- bool ret;
- string cc = "";
- string aa = "";
- do
- {
- cc = Console.ReadLine();
- for (int i = 0; i < 20000; i++)
- {
- aa += cc;
- }
- if (!cc.Equals("exit"))
- {
- Console.WriteLine("========================CheckByRegex=========================");
- HighResolutionTimer timer = new HighResolutionTimer();
- timer.Start();
- ret = checkbyRegex("^[^,]+$", aa);
- timer.Stop();
- Console.WriteLine("thr Result of checkbyRegex:" + ret.ToString() + " time: " + timer.ElapsedTime);
- Console.WriteLine("=============================================================");
- Console.WriteLine("========================checkbyArray2=========================");
- timer.Start();
- ret = checkbyArray2(",//", aa);
- timer.Stop();
- Console.WriteLine("thr Result of checkbyArray2:" + ret.ToString() + " time: " + timer.ElapsedTime);
- Console.WriteLine("=============================================================");
- Console.WriteLine("========================checkbyArray1=========================");
- timer.Start();
- ret = checkbyArray1(",//", aa);
- timer.Stop();
- Console.WriteLine("thr Result of checkbyArray1:" + ret.ToString() + " time: " + timer.ElapsedTime);
- Console.WriteLine("=============================================================");
- }
- } while (!cc.Equals("exit"));
- }
- private static bool checkbyRegex(string regstr, string value)
- {
- Regex r = new Regex(regstr);
- return r.IsMatch(value);
- }
- private static bool checkbyArray1(string chars, string value)
- {
- char[] arr = chars.ToCharArray();
- foreach (char ch in arr)
- {
- if (value.IndexOf(ch)>0)
- {
- return false;
- }
- }
- return true;
- }
- private static bool checkbyArray2(string chars, string value)
- {
- char[] arr = chars.ToCharArray();
- bool ret = true;
- foreach (char ch in arr)
- {
- ret &= (value.IndexOf(ch) < 0);
- }
- return ret;
- }
- }
- }
- public class HighResolutionTimer
- {
- [System.Runtime.InteropServices.DllImport("KERNEL32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
- private static extern bool QueryPerformanceCounter([In, Out] ref long performanceCount);
- [System.Runtime.InteropServices.DllImport("KERNEL32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
- private static extern bool QueryPerformanceFrequency([In, Out] ref long frequency);
- private long start;
- private long stop;
- private long frequency;
- public HighResolutionTimer()
- {
- QueryPerformanceFrequency(ref frequency);
- }
- public void Start()
- {
- QueryPerformanceCounter(ref start);
- }
- public void Stop()
- {
- QueryPerformanceCounter(ref stop);
- }
- public float ElapsedTime
- {
- get
- {
- float elapsed = (((float)(stop - start)) / ((float)frequency));
- return elapsed;
- }
- }
- }