如何利用C#正则表达式判断是否是有效的文件及文件夹路径

目录
  • 省流
  • 学习编写验证过程
    • 元字符metacharacter
    • 关于^和$
    • 关于(),[],和{}
  • 总结

省流

/// <summary>
/// 是否有效的文件,文件夹路径
/// </summary>
/// <param name="val"></param>
/// <returns>是,返回true;不是返回false</returns>
public bool IsValidFolderPath(string val)
{
    Regex regex = new Regex(@"^([a-zA-Z]:\\)([-\u4e00-\u9fa5\w\s.()~!@#$%^&()\[\]{}+=]+\\?)*$");
    Match result = regex.Match(val);
    return result.Success;
}

// "F:\\Total客户端项目\\客户端项目\\2017-01-09 Client\\(aa)\\V1.3.4\\New_1.2\\V13&V14\\.()~!@#$%^&()-+="; // 匹配结果:true

解释:

分为2大段,一段匹配盘符,一段匹配后续文件、文件夹路径

  • ^([a-zA-Z]:\\):必须以盘符的形式开头。

    ^表示从起始位置匹配,[a-zA-Z]表示第1位必须是a~z或A~Z其中之一。:\\表示第1位后必须接字符串:\。\\是正则中\的转义。

  • ([-\u4e00-\u9fa5\w\s.()~!@#$%^&()\[\]{}+=]+\\?)*$:后续以一定取值范围组成一个个结构。

    先看[]内,\u4e00-\u9fa5表示匹配汉字,\w,\s都是元字符有其对应的匹配范围。其余这些字符-.()~!@#$%^&()\[\]{}+=就代表它们自身。其中\[是[的转义,\]是]的转义。[~]+表示[]中的内容至少需要出现1次。\\?表示,[~]内的字符写完后,可以在后面接一个字符\,也可以不接。(~)*表示()内容可以重复任意次数,也可以一次不出现。$表示匹配到结束位置,搭配前面的^表示整个输入字符串的结构都得符合这个正则表达式。

几点注意:

  • 上面得[~]指代表达式中[]的所有内容,(~)指代表达式中()的所有内容,应该挺好理解吧。
  • 写了解释主要是自己总结一下,你看估计也看不懂,要不直接拿去用,要不老老实实去学吧,这些都是基础,就把正则表达式的基础学了基本就够用。
  • 不同系统下可不可以匹配汉字是不一样的。比如C#环境里\w好像就可以匹配汉字,但javascript环境里\w就匹配不了汉字。
  • 正则自己的转义和放入字符串中的转义挺容易懵的,写的时候要注意。
  • 个人理解,只有一个路径,是判断不出来这个路径是文件还是文件夹的,因为文件夹名也可以叫setup.exe,文件名也可以没有后缀。windows的文件命名规范中只不允许9个字符的出现。/ \ ? * : " < > |其他都可以。

学习编写验证过程

鉴于网上找了好几个都是垃圾,既不好使也不知道到底在判断啥,所以不得不万事靠自己。

学习自https://www.jb51.net/tools/zhengze.html

元字符metacharacter

字符 相关解释  
\b 匹配单词的开头或结尾,也就是单词的分界处。可用于精确查找一个单词  
. 匹配除了换行以外的任意字符  
* *前面的内容可以重复任意次  
+ +前面的内容可以连续重复1或任意更多次。通俗一点说,就是至少得匹配一次。  
? ?前面的内容可以连续重复0或1次。  
{x} x:数字。{x}前面的内容必须重复x次  
{x,} x。{x,}前面的内容必须重复至少x次  
{x,y} x,y:数字。{x,y}前面的内容必须重复x,y之间的次数,包括x,y  
(xxx) 表示分组  
[x,y,z] 表示单个匹配  
\d 匹配一位十进制数字,也就是0~9 [0-9]
\s 匹配任意空白符,空格,制表符,换行符,中文全角空格等  
\w 匹配数字,字母,下划线【中文】 [a-z0-9A-Z_]
^ 匹配字符串的开始位置  
$ 匹配字符串的结束位置  

如何从一个字符串中查找字符串‘hi’?

Regex regex = new Regex("hi");
// 注意:如history,high等词中的hi也会被匹配。

如何精确查找hi这个词?使用\b

Regex regex = new Regex(@"\bhi\b");

这样就可以精确查找到‘hi’这个词。

如何查找hi,xxxxx,Lucy?

Regex regex = new Regex(@"\bhi\b.*\bLucy\b");
// `.*`不能换行。是匹配不包含换行的任意数量字符

如何匹配一个中国电话号码?格式为:xx-xxxxxxxxxxxxxxx

Regex regex = new Regex(@"\d\d-\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d");

如何匹配一个188开头的电话号码?

Regex regex = new Regex(@"\d\d-188\d\d\d\d\d\d\d\d\d\d\d\d");

这如果要匹配一个100位数字岂不是都写不下了,所以必然存在优化写法。

Regex regex = new Regex(@"\d{2}-188\d{12}");

\d{2} 的话能不能匹配85555这种?与high中匹配hi一样?

如果没有限制也是会都匹配的,如果想要精确匹配,也要在前后使用元字符\b

如果有长号有短号想一起匹配怎么办?

Regex regex = new Regex(@"\d{2,3}-188\d{6,12}");

解析一个电话号相关的表达式^\(?0\d{2}[) -]?\d{8}

  • ^:表示验证字符串必须以(或0开头
  • \(? : \(是(的转义,?表示出现1次或不出现
  • 0\d{2} : 表示0起始后面跟2位数字
  • [) -]?:表示数字后面的1位或者什么都没有,或者是),空格,-3个中的一个
  • \d{8}:表示8位数字。
string phone = "(010)88886666";
string phone1 = "(010x88886666";
string phone2 = "011)-888866660000";
string phone3 = "011-888866660000";
string phone4 = "99011-88886666";
Regex regex30 = new Regex(@"^\(?0\d{2}[) -]?\d{8}");
Match resultphone = regex30.Match(phone);// 匹配成功
Match resultphone1 = regex30.Match(phone1);// 匹配失败,因为010后出现了[]中不存在的字符
Match resultphone2 = regex30.Match(phone2);// 匹配失败,因为[]后没有接8位数字,不是说-也在[]中就可以,[]永远只匹配一个位置
Match resultphone3 = regex30.Match(phone3);// 匹配成功,因为这个正则表达式没有用$限制结尾
Match resultphone4 = regex30.Match(phone4);// 匹配失败,因为这个正则表达式用^限制了开头,必须为(或0。

关于^和$

以前老不理解这玩意都啥用,其实就是对匹配范围进行限制。以一段数字字符为例。

正常使用9/d{2}进行匹配,匹配条件可以解释为,“以9开头并在后面跟任意2位数字的字符串”可以匹配成功,也就是998。

但如果使用^进行限制^9/d{2}。匹配条件就变为“输入字符串必须是以9并在后面跟任意2位数字开头的字符串”。匹配就会失败。

把9去掉^/d{2},匹配条件就变为“输入字符串必须是以任意2位数字开头的字符串”。匹配就会成功。

若用$限制/d{2}$,匹配条件就变为“输入字符串必须是以任意2位数字结尾的字符串”。匹配成功。

若改为58$,匹配条件就变为“输入字符串必须是以‘58’结尾的字符串”。匹配就会失败。

若用^,$限制,^/d{2}$,匹配条件就变为“输入字符串必须是2位数字的字符串”,匹配失败。

改为^/d{18}$,,匹配条件就变为“输入字符串必须是18位数字的字符串”,匹配成功。

代码如下:

string numberStr2 = "123456789987645312";
Regex regex2 = new Regex(@"9\d{2}");
Match result2 = regex2.Match(numberStr2);

Regex regex3 = new Regex(@"^9\d{2}");
Match result3 = regex3.Match(numberStr2);

Regex regex4 = new Regex(@"\d{2}$");
Match result4 = regex4.Match(numberStr2);

Regex regex5 = new Regex(@"58$");
Match result5 = regex5.Match(numberStr2);

Regex regex6 = new Regex(@"^\d{2}$");
Match result6 = regex6.Match(numberStr2);

Regex regex7 = new Regex(@"^\d{18}$");
Match result7 = regex7.Match(numberStr2);

关于(),[],和{}

首先是{},这个没什么说的,就是表示重复次数的。{2},{2,},{2,5}这种。

其次[]表示单个匹配。只能表示1个位置,这个位置的内容必须为[]中的选项之一。

看到这么描述大约有以下几种疑问

单独使用[]有啥用?

Regex regex8 = new Regex(@"[打]");
Match result8 = regex8.Match(Str8);

Regex regex9 = new Regex(@"[打s]");
Match result9 = regex9.Match(Str8);

Regex regex10 = new Regex(@"[打s黑]");
Match result10 = regex10.Match(Str8);

Regex regex11 = new Regex(@"[黑]");
Match result11 = regex11.Match(Str8);

Regex regex12 = new Regex(@"打");
Match result12 = regex12.Match(Str8);

Regex regex13 = new Regex(@"黑s打");
Match result13 = regex13.Match(Str8);// 匹配失败

Regex regex14 = new Regex(@"[黑s打]");// 匹配成功,找到‘打'
Match result14 = regex14.Match(Str8);

// 单独使用就是从头至尾匹配输入字符串的每一个字符。找到输入字符串中第一个能与[]中任意一个字符匹配的上的。
// 如果[]中只有1个字符,那有没有[]完全一样。如果[]内有多个字符是不一样的。
// 想象不出来使用场景,[]在实际应用中也大多配合其他条件一起使用

[]里要是有元字符怎么办?

解决方法很简单:转义。

但具体怎么转其实还是有点绕。这个绕不是说有多难,而是这个点你需要有印象,遇到的时候要能反映过来。

这个我认为很容易懵的点在于C#自身字符串的转义与正则表达式的转义混合。

首先明确一下C#中的转义,C#中转义有2种方法:

// 字符原文:
//a我打[]{}aa\bb"cc''dd^ee/dff
//another row
// '[',']','{','}',''','^','/'本身就不需要转义,需要转义的是'\','"',换行

// 第1种 需要转义的符号前加'\'
string stringStr1 = "a我打[]{}aa\\bb\"cc''dd^ee/dff\r\nanother row";
// 第2种,整个字符串用'@'修饰
// 这种情况下,'\',换行不用转义了。但'"'还需要转义,因为不转义字符串就提前结束了,用两个双引号'""'表示普通字符'"'
string stringStr2 = @"a我打[]{}aa\bb""cc''dd^ee/dff
another row";

正则表达式中需要转义的符号很多,所有元字符全部需要转义。但好消息是转义方式只有1种,就是在需要转义的符号前加\。

这再把这些表达式放入C#字符串中,就分不清到底是字符串转义,还是正则转义,正则转义后进入字符串会不会又要转义等等等等。懵。

元字符包括:( ) [ ] { } \ ^ $ | ? * . + /。 ”/“需不需要转义好像有点争议。查了一下发现很多编译器关于正则的转义是有一些默认处理的,也没找到个权威的规则,就视具体情况而定。

// 上面的例子,匹配一个9开头跟2个数字的字符
Regex regex15 = new Regex("9\d{2}"); // 这样写就会报错,因为正则'\d'中的'\'是c#字符串中转义的标识。这么写C#就会认为'\d'是一个转义符,而又不知道转义成了什么,就会报错:CS1009:无法识别的转义序列。
// 所需要将'\'转义,如上使用@或另一种转义方法都可以
Regex regex16 = new Regex(@"9\d{2}");
Regex regex17 = new Regex("9\\d{2}");

// 另一个很需要有印象的例子。就是一个位置只能使用字符'\'或字符'd'
// 其实很简单,用[]就行
Regex regex18 = new Regex("[\d]");//如上报错:CS1009:无法识别的转义序列。
// 一开没转义,改为
Regex regex19 = new Regex("[\\d]");//编译通过,完活。
string str10 = @"a我打[]{}aa\bb""cc''dd^ee/dff\\";
Match result19 = regex19.Match(str10);// 匹配失败
// 然而result19的结果是 匹配失败。
// 这就是字符转义与正则转义的混合。
// '\\d'仅处理了字符串中'\'的问题,没有解决正则'[\d]'中'\'也需要转义的问题;
// 想要实现一个位置只能使用字符'\'或字符'd',正确的正则表达应该为[\\d]
// 那么再将其放入C#字符串中,每个'\'都要再转义一次,即为
Regex regex20 = new Regex("[\\\\d]");
Match result20 = regex20.Match(str10);
// 或
Regex regex21 = new Regex(@"[\\d]");
Match result21 = regex21.Match(str10);
// 我还好奇了一下[]中有重复字符会怎样
Regex regex22 = new Regex(@"[\\\\d]");
Match result22 = regex22.Match(str10);
// 结果好像没啥区别,有相同字符无所谓的,没影响

// 这里后续使用又发现了一点,补充一下
// 前文提到:
Regex regex19 = new Regex("[\\d]");
string str10 = @"a我打[]{}aa\bb""cc''dd^ee/dff\\";
Match result19 = regex19.Match(str10);
// 会编译通过,但是匹配失败。这里遗漏了一个问题,就是new Regex("[\\d]");到底再匹配什么?
// 答案就是它再匹配'/d',也就是任意以为0~9的数字
string str101 = @"a我打[]{}aa\bb""cc''dd^ee/dff\\";
string str102 = @"a我打[]{}aa\bb""cc''d9d^ee/dff\\";//中间加了个9
Regex regex191 = new Regex("[\\d]");
Match result191 = regex191.Match(str101);//匹配失败
Match result192 = regex191.Match(str102);//匹配成功,找到9
//所以[],不止能匹配[]中的实际内容,还可以配合元字符匹配所有那一类字符

[]搭配-可以表示连续的字符

Regex regex22 = new Regex("[0-3]");// 某位置匹配0~3,也就是0,1,2,3

[]搭配^可以表示排除

Regex regex23 = new Regex("[^0-3]");//  某位置匹配除了0,1,2,3都可以。

可以复习一下要是就想匹配-,^,甚至[]怎么办?

Regex regex24 = new Regex("[\\^\\[\\]\\-]");
//或
Regex regex25 = new Regex(@"[\^\[\]\-]");

这里实际试了一下这些特殊字符,除了[ 和 ]不转义也能匹配,迷惑。

最后就是(),()有很多功能,包括限制多选结构的范围,分组,捕获文本,环视,特殊模式处理。

我感觉比较基础的使用就是限制多选与分组。

// 匹配必须整段一模一样的abc或bcd或cde,
Regex regex26 = new Regex("(abc|bcd|cde)");

// 匹配必须有连续2个adb的重复,也就是abcabc,abcaabc不行
Regex regex27 = new Regex("(abc){2}");

总结

到此这篇关于C#利用正则表达式判断是否是有效的文件及文件夹路径的文章就介绍到这了,更多相关C#正则表达式判断有效文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#匹配中文字符串的4种正则表达式分享

    本文介绍在C#中使用匹配中文的正则表达式,包括纯中文.有中文.中文开头.中文结尾等几个正则表达式示例.在正则表达式中,中文可以通过Unicode编码来确定正则表达式范围. 在C#中,匹配中文的正则表达式用Unicode来表示时,范围是: [\u4e00-\u9fa5].所以,在此基础上,我们可以得到如下一些正则表达式. 1.匹配字符串全部是中文字符的正则表达式 复制代码 代码如下: "^[\u4e00-\u9fa5]+$" 说明:"^"表示字符串开头,"$

  • C# 正则表达式 使用介绍

    为了避免以后这样的情况,在此记录下正则表达式的一些基本使用方法附带小的实例.让以后在使用时能一目了然知道他的使用,为开发节约时间,同时也分享给大家 正则元字符 在说正则表达式之前我们先来看看通配符,我想通配符大家都用过.通配符主要有星号(*)和问号(?),用来模糊搜索文件.winodws中我们常会使用搜索来查找一些文件.如:*.jpg,XXX.docx的方式,来快速查找文件.其实正则表达式和我们通配符很相似也是通过特定的字符匹配我们所要查询的内容信息.已下代码都是区分大小写. 常用元字符 代码

  • C#正则表达式匹配与替换字符串功能示例

    本文实例讲述了C#正则表达式匹配与替换字符串功能.分享给大家供大家参考,具体如下: 事例一:\w+=>[A-Za-z1-9_],\s+=>任何空白字符,()=>捕获 string text = @"public string testMatchObj string s string match "; string pat = @"(\w+)\s+(string)"; // Compile the regular expression. Regex

  • C#正则表达式之Regex类用法详解

    Regex 类表示不可变(只读)的正则表达式.它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类. 正则表达式基础概述 什么是正则表达式 在编写字符串的处理程序时,经常会有查找符合某些复杂规则的字符串的需要.正则表达式就是用于描述这些规则的工具.换句话说,正则表达式就是记录文本规则的代码. 通常,我们在使用WINDOWS查找文件时,会使用通配符(*和?).如果你想查找某个目录下的所有Word文档时,你就可以使用*.doc进行查找,在这里,*就被解释为任意字符串.和通配

  • 常用正则 常用的C#正则表达式

    常用的C#正则表达式! "^\d+$" //非负整数(正整数 + 0)  "^[0-9]*[1-9][0-9]*$" //正整数  "^((-\d+)|(0+))$" //非正整数(负整数 + 0)  "^-[0-9]*[1-9][0-9]*$" //负整数  "^-?\d+$" //整数  "^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0)  "^(([0-9

  • c#匹配整数和小数的正则表达式

    匹配整数的一种表达式: Regex.IsMatch(inputerstr, "^([0-9]{1,})$") 其中Inputerstr是要匹配的字符串 这个表达式仅匹配整数,如果是整数形式返回true,否则为false 匹配小数格式的表达式: Regex.IsMatch(inputerstr, "^([0-9]{1,}[.][0-9]*)$") 其中Inputerstr是要匹配的字符串 这个表达式仅匹配数字中有小数点格式的数字,如果是带有小数点格式的纯数字,返回tr

  • C#正则表达式使用方法示例

    第一步先要引入有关正则式的命名空间: 复制代码 代码如下: using System.Text.RegularExpressions; 第二步用指定的正则式构建一个正则表达式对象,下面的正则式是用来搜索长度为10的a-z的英文字母: 复制代码 代码如下: Regex obj = new Regex("[a-z]{10}"); 最后,根据正则式在指定数据中检索匹配项,如果匹配IsMatch方法就会返回true. 复制代码 代码如下: MessageBox.Show(obj.IsMatch

  • C#中正则表达式的3种匹配模式

    在C#中,我们一般使用Regex类来表示一个正则表达式.一般正则表达式引擎支持以下3种匹配模式:单行模式(Singleline).多行模式(Multiline)与忽略大小写(IgnoreCase). 1. 单行模式(Singleline) MSDN定义:更改点 (.) 的含义,使它与每一个字符匹配(而不是与除 \n 之外的每个字符匹配). 使用单行模式的典型场景是获取网页源码中的信息. 示例: 我们使用WebBrowser控件,从http://www.xxx.com/1.htm上获取了如下HTM

  • C#使用正则表达式实例

    正则表达式可以被看成是一个强大的通配符(通用匹配符号).大多数人都应该很熟悉通配符,例如,当我们看到一个诸如"SAMS"的表达式,那么一个文本串中任何以SAMS开头的字符串都可以与这个表达式匹配.正则表达式提供了比这种通配符能力更强.控制规则更复杂.功能更完善的匹配机制. 本文将对.NET框架提供的支持正则表达式的类做一个概要介绍.要想获得有关正则表达式的更多知识,可参考<Regular Expression Pocket Reference >(O'Reilly Medi

  • 如何利用C#正则表达式判断是否是有效的文件及文件夹路径

    目录 省流 学习编写验证过程 元字符metacharacter 关于^和$ 关于(),[],和{} 总结 省流 /// <summary> /// 是否有效的文件,文件夹路径 /// </summary> /// <param name="val"></param> /// <returns>是,返回true:不是返回false</returns> public bool IsValidFolderPath(str

  • 利用正则表达式判断一个给定的字符是否是回文

    如果给定的字符串是回文,返回true,反之,返回false. 如果一个字符串忽略标点符号.大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindrome(回文). 注意你需要去掉字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是否为回文. 函数参数的值可以为"racecar","RaceCar"和"race CAR". 关键代码: 去掉字符串中的标点符号和空白格.可以用str.replace()+正则表达式匹配. v

  • C#中如何利用正则表达式判断字符

    废话不多说了,下面代码给大家介绍下利用正则表达式判断字符的方法,具体代码如下所示: using System; using System.Text.RegularExpressions; using System.NET; namespace 正则表达式检测字符串 { class Program { static void Main(string[] args) { Console.WriteLine("请输入字符串:"); string s = Console.ReadLine();

  • ios利用正则表达式判断手机号码格式是否正确的实例

    实例如下: //判断手机号码格式是否正确 + (BOOL)valiMobile:(NSString *)mobile { mobile = [mobile stringByReplacingOccurrencesOfString:@" " withString:@""]; if (mobile.length != 11) { return NO; }else{ /** * 移动号段正则表达式 */ NSString *CM_NUM = @"^((13[4-

  • C#正则表达式判断输入日期格式是否正确

    本文将介绍一段实例代码,来讲解利用正则表达式使C#判断输入日期格式是否正确的方法.希望这段代码能对大家有所帮助. 通常我们在用C#编写系统程序或者Web开发时,都会遇到需要验证输入的字符串是否是日期的情况,下面为大家介绍一种非常全面的用正则表达式验证日期的方法: c 正则表达式日期代码一: /// <summary> /// 是否为日期型字符串 /// </summary> /// <param name="StrSource">日期字符串(2008

  • 使用正则表达式判断密码强弱

    学python的re模板,写了个文章发现没人看,所以总结出来经验,理论没人爱,实战的人心,那么既然没人喜欢理论就直接上实战,在实战中精炼理论.不多说直接先上代码 def password_level(password): weak = re.compile(r'^((\d+)|([A-Za-z]+)|(\W+))$') level_weak = weak.match(password) level_middle = re.match(r'([0-9]+(\W+|\_+|[A-Za-z]+))+|

  • 使用正则表达式判断是否为手机号码(简单且实用)

    下面一段代码是关于正在表达式判断是否为手机号码的代码,具体代码如下所述: public static boolean isMobileNO(String mobile) { Pattern p = Pattern .compile("^((13[0-9])|(15[^4,\\D])|(18[0-9]))\\d{8}$"); Matcher m = p.matcher(mobile); return m.matches(); } 以上所述是小编给大家介绍的使用正则表达式判断是否为手机号码

  • iOS 正则表达式判断纯数字及匹配11位手机号码的方法

    第一种使用正则表达式 判断 //是否是纯数字 + (BOOL)isNumText:(NSString *)str{ NSString * regex = @"(/^[0-9]*$/)"; NSPredicate * pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; BOOL isMatch = [pred evaluateWithObject:str]; if (isMatch)

  • iOS 中使用正则表达式判断身份证格式及银行卡号格式是否正确(推荐)

    1.有时候我们会用到上传身份证号,或者银行卡号,这个时候就需要我们对身份证号以及银行卡号,进行基本的判断. 下面便是身份证号的判断返回YES是合法,反之不合法 #pragma mark 判断身份证号是否合法 - (BOOL)judgeIdentityStringValid:(NSString *)identityString { if (identityString.length != 18) return NO; // 正则表达式判断基本 身份证号是否满足格式 NSString *regex2

  • java使用正则表达式判断邮箱格式是否正确的方法

    本文实例讲述了java使用正则表达式判断邮箱格式是否正确的方法.分享给大家供大家参考.具体如下: import java.io.*; public class CheckEmail { public static boolean checkEmail(String email) {// 验证邮箱的正则表达式 String format = "\\p{Alpha}\\w{2,15}[@][a-z0-9]{3,}[.]\\p{Lower}{2,}"; //p{Alpha}:内容是必选的,和

随机推荐