c# 正则表达式提取()中的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 正则表达式提取()中的值相关的知识,希望对你有一定的参考价值。

string name ="Prolific USB-to-Serial Comm Port (COM5)";
我想用正则表达式提取()中COM到底是几。那个COM5是随机的,也许会变成COM23或者或者COM36

求大神的正则方式,我写的有问题,string pattern = @"(COM[1-9][0-9]?)$";

参考技术A

您的正则表达式基本正确,只需要将结尾的$符号去掉即可匹配包含COM的子串。另外,如果括号中只有COM后面的数字部分需要提取,可以使用正则表达式的捕获组功能,将COM和数字部分分别放在不同的捕获组中,然后只提取数字部分即可。

解释一下上述正则表达式的含义:

    \\b 匹配单词边界,用于确保COM前面不会有其他字符,避免匹配到类似ACOM1这样的字符串。

    (COM\\d+) 括号内是一个捕获组,匹配COM后面的一个或多个数字,\\d表示数字字符,+表示匹配一次或多次。

    \\b 匹配单词边界,用于确保COM后面不会有其他字符,避免匹配到类似COM5A这样的字符串。

参考技术B \(COM(?<port>\d+)\)
取命名组 port

using System.Text.RegularExpressions;
// Regex Match code for C#
void MatchRegex()

// Regex match
RegexOptions options = RegexOptions.None;
Regex regex = new Regex(@"\(COM(?<port>\d+)\)", options);
string input = @"Prolific USB-to-Serial Comm Port (COM23)";
// Check for match
bool isMatch = regex.IsMatch(input);
if( isMatch )

// TODO: Do something with result
System.Windows.Forms.MessageBox.Show(input, "IsMatch");

// Get match
Match match = regex.Match(input);
if( match != null )

// TODO: Do something with result
System.Windows.Forms.MessageBox.Show(match.Value, "Match");

// Get matches
MatchCollection matches = regex.Matches(input);
for( int i = 0; i != matches.Count; ++i )

// TODO: Do something with result
System.Windows.Forms.MessageBox.Show(matches[i].Value, "Match");

// Numbered groups
for( int i = 0; i != match.Groups.Count; ++i )

Group group = match.Groups[i];

// TODO: Do something with result
System.Windows.Forms.MessageBox.Show(group.Value, "Group: " + i);

// Named groups
string groupA = match.Groups["port"].Value;

// TODO: Do something with result
System.Windows.Forms.MessageBox.Show(groupA, "Group: port");

追问

能写详细点吗?

追答

看上面代码

本回答被提问者采纳

C#中的正则表达式

对于正则表达式的应用, 基本上可以分为验证、提取、分割和替换。仅仅利用Regex类就可以实现验证和简单替换。
利用Regex类实现验证
经历2009年的备案和DNS停止解析风波之后,大部分的带有反馈性的网站 和论坛都对一些敏感词进行了过滤,包含有这类敏感词的文章要么内容被替换要么被禁止发表,利用Regex类就可以实现这个功能,下面是一个例子:
///
/// 检查字符串中是否有“孙权”这个敏感词
///
public void IsMatchDemo()

{

     string source = "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操许攸郭嘉需晃袁绍"; 

     Regex regex = new Regex("孙权"); 

     //if (Regex.IsMatch(source, "孙权")) 

     //下面这句和上面被注释掉的一句作用的同样的 

     if (regex.IsMatch(source)) 

     { 

             Console.WriteLine("字符串 中包含有敏感词:孙权!"); 

     } 

输出结果:字符串中包含 有敏感词:孙权!
对于上面的例子,如果要 检查的字符串中包含“孙权”这个关键词就会在控制台上输出提示,当然在实际的应用中可能是包含有被禁止的词语的内容不允许提交而不是仅仅提示了。不过这类 情况仍有办法可以绕过,可以使用“孙-权”或“孙+权”来替换孙权从而来绕过验证。
对于中文字符串还比较好 说,对于英文的字符串还要考虑每个字母的大小写情况了。比如我们禁止在内容中出现某个关键词(如太CCTV的CCTV,或者CCAV),难道我们要针对字符串中每个字母的大小写情况进行多种情况的组合验证?不,完全没有必要,下面就是一个例子:

///

/// 检查字符串中是否有“def”的任何大小写形式

///

public void IsMatchDemoWithOption()

{

     string source = "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍"; 

     Regex regex = new Regex("def",RegexOptions.IgnoreCase); 

     if (regex.IsMatch(source)) 

     { 

             Console.WriteLine("字符串 中包含有敏感词:def!"); 

     } 

}

输出结果:字符串中包含 有敏感词:def!

在上面的例子中,实例化Regex时采用了两个带参数的构造函数,其中第二个参 数就是上一篇中提到的RegexOptions枚举,RegexOptions.IgnoreCase表示匹配字符串的时候不管大小写是否一致。
此外,在Regex中存在着一些功能相同的静态方法和实例方法, 如:IsMatch()方法,在第一个例子中我 还写出了两种方法的实例,如下:
Regex regex = new Regex(“孙权”);

//if (Regex.IsMatch(source, “孙权”))

//下面这句和上面被注释掉的一句作用的同样的

if (regex.IsMatch(source))
其实在.NET Framework中很多类都有这样类似的情况,在System.IO命名空间下还有File及FileInfo这样的静态类和非静态类的情况,其实它们提供 了相似的功能,用小沈阳的话说“这是为什么呢”?有部分是出自效率的考虑,并且也有出自让代码编写方便和看起来简洁的因素。对于偶尔一半次为之的情况,建 议使用静态方法,这样有可能会提高效率(因为采用静态方法调用的正则表达式会被内部缓存,默认情况下会缓存15个,可以通过设置Regex类的CacheSize属性来更改缓存个数),如果是要在循环中多次 使用,那就采用实例方法吧。
使用Regex类进行替换
上面的处理仅仅是查看提 交的内容中是否有被禁止的关键词,其实有时候还可以做到将被禁止的关键词进行替换,例如将上面用到的字符串中的任何形式的"ABC"替换成"|",下面就是一个例子:
///

/// 实现字符串替换功能

///

public void Replace()

{

     string source = "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍"; 

     Regex regex = new Regex("abc", RegexOptions.IgnoreCase); 

     string result=regex.Replace(source, "|"); 

     Console.WriteLine("原始字符串:" + source); 

     Console.WriteLine("替换后的字符串:" + result); 

}
输出结果:
原始字符串:刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍
替换后的字符串:刘备|关羽|张飞|赵云|诸葛亮|孙权|周瑜|鲁肃|曹操DEF许攸郭嘉需晃袁绍
实际上有时候我们遇到的 情况可能不仅仅这么简单,例如有时候我们希望将字符串中的任何形式的“ABC”及“DEF”实现HTML形式的加粗,也就是替换成abcdef这种形式,当然还保持和原来一致的大小写形式,代码如下:
///

/// 实现字符串替换功能

///

public void ReplaceMatchEvaluator()

{

     string source = "刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍"; 

     Regex regex = new Regex("[A-Z]{3}", RegexOptions.IgnoreCase); 

     string result = regex.Replace(source, new MatchEvaluator(OutPutMatch)); 

     Console.WriteLine("原始字符串:" + source); 

     Console.WriteLine("替换后的字符串:" + result); 

}

///

/// MatchEvaluator委托中调用的方法,可以对匹配结果进行处理

///

/// 操作过程中的单个正则表达式匹配

///

private string OutPutMatch(Match match)

{

     return "<b>" + match.Value + "</b>"; 

}
输出结果如下:
原始字符串:刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍
替换后的字符串:刘备ABC关羽ABc张飞Abc赵云abc诸葛亮aBC孙权abC周瑜AbC鲁肃aBc曹操DEF许攸郭嘉需晃袁绍
在上面的例子中,我们使 用了MatchEvaluator委托,并且还涉及到了Match类(Match类将会在下一篇讲述),在MatchEvaluator委托中使用到的Match类表示了单个的正则表达式匹配,通过改变match实例中Value的值来达到完成替换的目的。
在本篇中仅仅是讲述了Regex类的一些简单用法,也没有讲述正则表达式的相 关知识,不过即使如此也能减轻我们的一部分工作,学习和灵活运用正则表达式是一个长期积累的过程。

以上是关于c# 正则表达式提取()中的值的主要内容,如果未能解决你的问题,请参考以下文章

c#使用正则表达式匹配数据 并计算填入新的值

c# 正则表达式截取字符串

C# 正则表达式提取html中的文本

C#取括号里面的值,正则表达式怎么写

如何使用 R 中的正则表达式提取 2 个或多个特殊字符之间的值? [复制]

c#使用正则表达式提取内容