输入的验证,但是字符串不是真的数组

作者: 编程  发布:2019-11-21

第一种就是 最常见的 用Try..Catch..

VS提供了一个模版“控制台应用程序”,这种应用程序主要不是用来与用户交互的,或做一些后台程序运行的展示,或用来练习C#语法,如果当做C#语法学习的平台,在这里就说一下在控制台下的输入验证吧。

1.String对象不可变

  • String对象不可变,只读。任何指向它的引用都不能改变它的内容。改变String内容意味着创建了一个新的String对象。
  • String 对象作为方法参数时都会复制一份引用(不是复制对象),而引用指向的对象一直呆在单一物理位置上。

一、字符串类型的特点

再try中强转你要确认的string 类型

控制台状态下,程序的输入输出是流的方式进行的,也就是光标是向前的(如果不做特殊处理的话),输入的验证,只能等用户输入完后,系统从缓冲区中把数据读出来进行验证(因为在这里没有按键事件)。举个例子吧,比如,我们提示用户从控制台上输入一个数字类型(如果是字符或字符串类型,问题就会少一点,因为Console.ReadLine或 Console.Read方法,是返回字符串和字符的),拿年龄来说明问题吧。

2.重载操作符和StringBuild

    • += 这2个符号作用于字符串和基本类型数据时意义不相同,Java只有这2个操作符被重载过。
  1. 拼接字符串 + += 编译器会调用StringBuild来工作。
  2. 拼接字符串时编译器会创建一个StringBuild对象来生成最终的String,并且调用append方法来拼接字符串,最后用toString输出。(一条表达式生成一个StringBuild对象)
  3. 如果 + +=在循环内,就会生成多个StringBuild对象,影响性能。如果在循环外创建StringBuild对象循环内调用append方法,就会只有一个对象。
  4. Object的toString方法输出引用所指向对象的内存地址,所有类都继承它,但大多数类覆写了toString方法,用来输出对象内容的字符串。

1、PHP是弱类型语言,其他数据类型一般都可以直接应用于字符串函数操作。

成功就是int  catch 就不是 

最直接的验证是这样的:

3.无意识的递归

  • 打印对象引用会调用toString,this代表调用当前方法的引用,所以this在toString中会发生递归调用。
<?php
echo substr("123456",2,4);  //输出345
echo substr(123456,2,4);    //输出345
echo hello;                 //先查找hello常量,若没找到,将hello看做字符串使用
?>
            string a = "avdfd";
            try
            {
                int b = int.Parse(a);
            }
            catch (Exception)
            {
                Console.WriteLine("不是");
            }

            Console.WriteLine("请输入年龄:");

4.格式化输出

2、字符串可以作为“数组”,是字符的集合。

还有就是简单一点的

            string agestr = Console.ReadLine();

4.1输出流的两种格式化输出方法。

  • printf( ) 这和C语言中的一样,使用%d、%f、%s等占位符,但C语言中不能拼接字符串,Java可以。
  • format()和printf( )一样,printf()调用了format()方法
<?php
$str = "www.jb51.net";
echo $str[0];
echo $str[1];
echo $str[2];
?>

int.Tryparse()

            int age;

4.2 Formatter类

  1. 新的格式化输出功能都由Formatter类提供。
  2. 创建Formatter对象要给构造器传递一些信息,告诉它最后输出到哪。

但是字符串不是真的数组,不能使用数组的函数.如count($str)不会返回字符串长度。PHP引擎无法区分字符和数组,产生二义性。自PHP4起,已经用花括号替代方括号。

比如 
bool  IsNumber = int.TryParse("你要判断的值",out int a);
这个更简单 但是上面那种好理解

            if (int.TryParse(agestr, out age))

4.2.3 格式化说明符

  • %[argument_index$] [flags] [width] [.precision] conversion  [ ] 内为可略内容
  1. argument_index 是一个十进制整数, 2$表示使用参数列表的第2个参数 。
  2. flags 是修改输出格式的字符集。有效标志的集合取决于转换类型。  
  3. width 是一个非负十进制整数,至少达到多少长度,不够用空格补齐,默认右对齐。 
  4. precision 是一个非负十进制整数,前面有个点,和width区分。通常用来限制字符数,表示最多多少位。整数无法使用,String型输出最大字符量,浮点型表示小数点位数,不足补0,超过四舍五入。
  5. 浮点数 %f 默认输出小数点后6位
  6. %b  对于Boolean 和 boolean型可以准确输出,对于其他类型只要不是null,就为true,0也是true。
  • 静态方法 String.format()返回一个String, 如果只使用一次format()方法,这个比较简单。
<?php
//为保证向后兼容,方括号仍然可以使用
$str = www.jb51.net;
echo $str{0};
echo $str{1};
echo $str{2};
?>

然后就是用正则去匹配

            {

5.正则表达式

3、双引号变量解析

Regex.IsMatch(input, @"^d+$")

                Console.WriteLine("你输入的年龄:", age);

5.1 String自带的正则表达式工具

  • s.split(regex)  将字符串从正则表达式匹配的地方割开,并返回String数组。
  • s.matches(regex) 返回boolean值, 是否能匹配到正则。
  • s.replaceFirst(regex  a)将第一个匹配到的正则换为a. s.replaceAll(regex  a)替换全部。
  • 只使用一次正则表达式建议使用自带的

在PHP中,当用双引号或者定界符定义字符串时,其中的变量会被解析。

 对了 还有一种就是从一段字符串中取数字类型的值  其实还是正则 (正则万岁)

            }

5.2 创建正则表达式对象

  1. 正则表达式预编译 Pattern p  = Pattern.compile(regex);  编译正则表达式是非常耗性能的,提前预编译可以提高性能,但不能再方法体中,因为会执行一次方法就会预编译一次,预编译也很耗性能。 
  2.  Pattern 是 final 类 只能通过静态方法它的compile创建对象。
  3. Matcher m = p.matcher(string);  Matcher 同样也是 final 类
  4. Pattern对象的matcher方法接受一个字符串并生成一个 Matcher 匹配器对象 ,通过匹配器可以获得字符串与正则的关系
  5. 匹配器的一些方法:
    • m.matches() 整个字符串是否匹配正则
    • m.lookingAt() 字符串的起始部分是否匹配
    • m.find() 查找下一个匹配(下一个意味着有迭代行为)
    • m.find(int start) 从指定位置开始匹配
    • find 只负责匹配,不返回匹配到的结果,匹配到的结果由group()获取。
<?php
$arr = array('name' => "dwqs",'add' => "www.ido321.com");
echo "$arr[name]";  //可以解析,但是在方括号中不能使用引号
//echo "$arr['name']";  错误
echo "{$arr['name']}";  //可以解析,用花括号包含元素,name不带引号也是可以的
//假设存在对象$square
echo "$square->width"; //可以解析
echo "$square->width00 cent"; //不可以解析,用花括号解决
echo "{$square->width}width00 cent"; //可以解析
?>
1 string str = "甘霖娘233不要再说了";    //我们抓取当前字符当中的233
2 string result = System.Text.RegularExpressions.Regex.Replace(str, @"[^0-9]+", "");3 Console.WriteLine(result);

            else

5.3 组

  • 组是用括号划分的正则表达式,由外向内,由左向右 编号0  1  2  3 。。。叫 组0,组1,组2 。。。
  1. Matcher对象获得组相关信息的方法
    • public int groupCount() 返回组的数量,不包括组0
    • public String group() 返回前一次的全匹配(组0)相当于group(0)
    • public String group(int i ) 返回 前一次匹配期间指定组,若之前匹配成功,指定组未能匹配则返回null
    • start(int group) 返回匹配到的指定组的起始位置索引。
    • start()返回匹配到的正则起始索引。
    • end(int group) 返回匹配到的指定组的最后一位索引再加一。
    • end()返回匹配到的正则最后一位索引再加一。

二、字符串输出函数

 

            {

6 Pattern标记

  • Pattern.compile(regex,int flage)  flage来自pattern类中的常量,可以调整匹配行为,是对正则式的一种约定。可是使用 | 组合多个标记。
  1. Pattern.CANON_EQ 两个字符当且仅当它们的完全规范分解相匹配时,就认为它们是匹配的。
  2. Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不敏感的匹配假定只有US-ASCII字符集中的字符才能进行。这个标记允许模式匹配不必考虑大小写(大写或小写)。通过指定UNICODE_CASE标记及结合此标记。基于Unicode的大小写不满干的匹配就可以开启了。
  3. Pattern.COMMENTS(?x) 在这种模式下,空格符将被忽略掉,并且以#开始直到行末的注释也会被忽略掉。
  4. Pattern.DOTALL(?s) 在dotall模式中,表达式"." 匹配所有字符,包括终结符。默认情况下,”." 表达式不匹配行终结符。
  5. Pattern.MULTILINE(?m) 在多行模式下,表达式^和$分别匹配一行的开始和结束。^还匹配输入字符串的开始,而$还匹配输入字符串的结尾。默认情况下,这些表达式仅匹配输入的完整字符串的开始和结束。
  6. Pattern.UNICODE_CASE(?u) 当指定这个标记, 并且开启CASE_INSENSITIVE时,大小写不敏感的匹配将按照与Unicode标准相一致的方式进行。默认情况下,大小写不敏感的匹配假定只能在US-ASCII 字符集中的字符才能进行
  7. Pattern.UNIX_LINES(?d) 在这种模式下,在., ^和$行为中, 只识别行终结符n

图片 1

                Console.WriteLine("你输入的年龄有误!");

7 split()

  • 切割字符串并返回切割后的字符串数组,一切split()方法底层都由Pattern的split()方法提供支持。

1.Pattern.compile(regex).split(String string);

2.Pattern.compile(regex).split(String string, int limit); 从第limit个开始不分割,包括limit。

三、常用的字符串格式函数

            }

8 替换

图片 2

我们利用类型.TryParse方法,来试图去转换一个类型,int.TryParse是试图把字符串转换成整型,当然,这个字符串必需是数字的字符串,这样才能转换成功,否则是不成功的,返回值是为false的,所以利用这点,就可以验证用户输入的年龄类型正确与否。其实上面写法还是复杂一点,于是就要简化一下,如下代码:

1.String自带替换

  • public String replaceFirst(String regex,String replacement)   只替换第一个匹配到的正则。
  • public String replaceAll(String regex,String replacement)  替换全部。

PS:PHP的字符串处理函数大部分不对源字符串做修改,而是返回新的字符串

           Console.WriteLine("请输入年龄:");

2. Matcher 替换

  • Pattern.compile(regex).matcher(str).replaceFirst(repl)   // String 方法的底层实现。
  • Pattern.compile(regex).matcher(str).replaceAll(repl)     // String 方法的底层实现。
  • appendReplacement(StringBuffer sb, String replacement)  渐进式替换  

    Pattern p = Pattern.compile("cat");

         Matcher m = p.matcher("one cat two cats in the yard");
         StringBuffer sb = new StringBuffer(); //用于接收被替换的部分
         while (m.find()) {
             m.appendReplacement(sb, "dog");
             //System.out.println(sb.toString());
         }
         m.appendTail(sb); //把剩余部分存入sb
         System.out.println(sb.toString());
    

//one dog
//one dog two dog
//one dog two dogs in the yard

 

四、正则表达式

            string agestr = Console.ReadLine();

 3 reset()

  • m. reset(string)   将Matcher对象应用于一个新的字符串,中途改变要匹配的字符串。

正则表达式描述了一种字符串匹配的模式,通过这个模式在特定的函数中对字符串进行匹配、查找、替换和分隔等操作,由原子、元字符和模式修正符三部分组成的文字模式。

            int age = int.TryParse(agestr, out age) ? age : 1;

9 正则与IO

在PHP中,有两套正则的处理函数库:PCRE和POSIX。前者以preg_前缀命名,与Perl兼容;后者以ereg_前缀命名。二者功能相似,但PCRE的效率略高。

            Console.WriteLine("年龄为:{0}", age);

10 扫描输入 Scanner

  • 对输入进行分词

1.scanner构造器接受任何类型的输入对象。

2.普通next()方法返回下一个string对象。

3.基本类型除char外的 nextXXX() 方法都返回对应类型的数字。

4.next方法只有找到一个完整的分词后才返回,否则线程挂起等待。

5.hasNexXXX()方法判断下一个分词是否是需要的类型。

6.scanner默认对空字符串分割。

7.scanner.useDlimiter(regex) 使用正则对输入分词

8.scanner.dlimiter() 返回 当前正则匹配到的字符串,并作为Pattern对象。

与Perl语言兼容的正则表达式处理函数:

用三元运算符可以在一定程度减少了代码量,但与之前不一样的是,在这里如果用户输入年龄有误,就会给一个默认值。

9 正则扫描

  • nextXXX( string)和hasNex(string)都可以传入String进行匹配。(注意是匹配不是分词)。也可以传入string类型和pattern类型的正则进行匹配。
  • 用正则匹配后调用scanner.match(),返回MatcherResult类型的扫描匹配结果。它包含了获得的内容及捕获组位置,通过group(i)获得对应组信息。

图片 3

上面这两种做法都还行,能起一定的效果,但最大的依赖是TryParse,这样在业务逻辑上有一点别扭,是通过一个方法来验证类型的。

知识点:

  1. String.trim() 删除前后空格。
  2. String.valueOf( ) 将基本类型,对象,和char[ ] 数组转换成字符串。 基本类型转String也可以直接加个空字符串  如 2+""

1、语法

其实用更好的办法,如下:

1.1 定界符:在与Perl兼容的正则函数中使用模式时,必须给模式加上定界符。除了字母、数字和反斜线()之外的任何字符都可以作为定界符号

            Regex reg = new Regex(@"^d+$");//重复一次或多次

<?php
//以下正则合法
echo $m1 = '/</w+/';
echo $m2 = '|(d{3})-d|Sm';
echo $m3 = '!^(?i)php[34]!';
echo $m4 = '{^s+(s+)?$}';
?>

            Console.WriteLine("请输入年龄:");

1.2 原子:原子包含了普通字符,如字母、数字;非打印字符,如空格、回车;特殊字符和元字符,如引号、*、+等,必须用””进行转义;自定义原子表,如[apj]、[a-z];通用字符类型,如d、D。

            string agestr = Console.ReadLine();

<?php
//下面二者等价,匹配e-mail
$mail1 = '/^[0-9a-zA-Z]+@[0-9a-zA-Z]+(.[0-9a-zA-Z]+){0,3}$/';
$mail2 = '/^w+@w+(.w+){0,3}$/';
?>

            if (reg.Match(agestr).Success)

1.3 元字符:用于构建正则表达式的具有特殊含义的字符。Perl可以使用各种元字符来搜索匹配,如*、+、?.常见的元字符如下

            {

图片 4

                Console.WriteLine("年龄是:{0}", agestr);

1.4 模式修正符:在正则的定界符之外使用,扩展正则在匹配、替换等方面的功能。

            }

图片 5

            else

2.与Perl兼容的正则表达式函数

            {

2.1 preg_match(string pattern,string subject[,array matches]):用于对字符串的查找和匹配。参数说明:

                Console.WriteLine("输入的年龄有误");

pattern是正则,subject是需要处理的字符串,可选的matches用于保存于pattern的各个子模式的匹配结果,matches[0]保存了与pattern匹配的整体内容,matches[1]保存了pattern中第一个小括号中匹配的内容,以此类推。

        }

<?php
header("content-type:text/html;charset=utf8");
$pattern = '/(http)://(www).([^./]+).(com|net|org)/i';
$subject = "我的博客:http://www.ido321.com";
if(preg_match($pattern, $subject,$matches)){
echo "搜索的URL是:".$matches[0]."<br/>";  //数组第1个元素保存整个匹配结果
echo "URL中的协议是:".$matches[1]."<br/>";//数组第2个元素保存第1个字表达式
echo "URL中的主机是:".$matches[2]."<br/>";//数组第3个元素保存第2个字表达式
echo "URL中的域名是:".$matches[3]."<br/>";//数组第4个元素保存第3个字表达式
echo "URL中的顶域是:".$matches[4]."<br/>";//数组第5个元素保存第4个字表达式
}
?>

正则表达式,它能很好解决这个问题,这里不是在讨论正则表达式,关于它的学习,请参考相关文档,在这里主要说明,在语言中引用这个技术,在很大程度上解决了数据的安全性,有效性。

结果

比如,我们都知道,年龄,特别是人的年龄,是在0到150,没有负数,也没有见过超过150岁的人,如果前两段代码做的话,那就是分段验证,前面验证是否为整型,后面验证是否在0到150岁之间,如果用正则,只需要如下变化:

图片 6

Regex reg = new Regex(@"^d$|^d{2}$|^1[0-4]d$|^150$");

preg_match_all()与preg_match()函数类似,不同的是前者会一直匹配到字符串末尾,后者在第一次匹配后就停止匹配。

只要一次的验证,改正则表达式,就能答到数据的验证。

2.2 preg_grep(string pattern,array iput):匹配数组中的元素,返回与正则匹配的数组单元。参数说明:

提倡用正则,但正则一般学习和理解起来有一点难度,这就是双刃剑。

pattern是正则,input是需要匹配的数组。

<?php
$arr = array('Linux RedHat9.0','Apache2.2.9','MySQL5.0.51','PHP5.2.6','LAMP','100');
$version = preg_grep('/^[a-zA-Z]+(d|.)+$/',$arr);
//输出:Array([1]=>Apache2.2.9 [2]=>MySQL5.0.51 [3]=>PHP5.2.6)
print_r($version); 
?>

2.3 preg_replace(mixed pattern,mixed replacement,mixed subject[,int limit]):字符串替换。说明:

该函数会在subject中搜索与pattern的匹配项,并用replacement替换。limit用于限制匹配的次数,即替换的次数。

<?php
$pattern = '/<[/!]*?[^<>]*?/is';
$text = '这个文本有<b>粗体</b>和<u>带有下划线</u>以及<i>斜体</i>';
echo preg_replace($pattern,"",$text);  //将所有HTML标记替换为空
echo preg_replace($pattern,"",$text,2); //值替换前2个HTML标记
?>

2.4 preg_split(string pattern,string subject[,int limit[,int flags]]):对字符串进行分割。说明:

函数返回一个数组。数组元素包含subject中与pattern匹配作为边界所分割的字符串,limit含义见2.3,flags含义请参考文档。

<?php
//按任数量的空格分割字符串
$kerwords = preg_split("/[s,]+/","hypertext language,programming");
//输出:Array([0]=>hypertext [1]=>language,[2[=>programming)
print_r($kerwords);
?>

您可能感兴趣的文章:

  • PHP函数preg_match_all正则表达式的基本使用详细解析
  • 解析PHP正则提取或替换img标记属性
  • 解析php利用正则表达式解决采集内容排版的问题
  • 解析PHP中的正则表达式以及模式匹配
  • php模板函数 正则实现代码
  • php下正则来匹配dede模板标签的代码
  • php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
  • php使用正则表达式进行字符串搜索的方法
  • PHP正则解析多重循环模板示例

本文由9159.com发布于编程,转载请注明出处:输入的验证,但是字符串不是真的数组

关键词:

上一篇:在线预览,代码裤子
下一篇:没有了