正则表达式C#。匹配特定的子字符串并仅返回该子字符串

时间:2013-11-28 11:53:49

标签: c# regex string

我一直在把头发拉过来,我觉得我很接近它的实际工作,但我似乎无法做到。

我一直在尝试使用Regex从字符串中提取特定的子字符串。此子字符串必须与某组字符串/数字匹配。然后,它应该返回到另一个函数,它只会提取数字。

以下是一些存在的字符串示例

"(DEV #198) I am a dev testing 23 different things."
"(dev #9540) I am a dev testing different other things."
"(FQ #1140) I am a dev testing different things."
"(fq #910) I am a dev testing different other things."

最后,我想将198,9540,1140或910作为最终变量,具体取决于输入。

到目前为止,这是我的正则表达式。我认为它很接近,但我需要一些帮助。 (注意C#的双反斜杠。)

^(?=.*?\\b(dev|DEV|fq|FQ)\\b)(?=.*?\\b[0-9]{3,4}\\b).*$

这是我正在使用的代码片段。

string caseNumber = cpTicket.Desc;
string regexPattern = "^(?=.*?\\b(dev|DEV|fq|FQ)\\b)(?=.*?\\b[0-9]{3,4}\\b).*$";
caseNumber = Regex.Match(caseNumber, regexPattern).ToString();

就我所知道的那样。如果你能提供帮助,我将非常感激:D

2 个答案:

答案 0 :(得分:2)

尝试以下表达式:

(?<=(?:dev|fq) #)\d+
  • (?<=):这是为了确保数字前面有后面的内容。
  • (?:dev|fq):匹配devfq
  • #:匹配一个后跟哈希#
  • 的空格
  • \d+:匹配一个或多个数字。

启用不区分大小写模式,因此devfq在所有情况下均可匹配。

您可以在正则表达式本身中转换不区分大小写,如下所示:

(?i)(?<=(?:dev|fq) #)\d+

在C#中:

var input = "(DEV #198) I am a dev testing 23 different things.";
var matches = Regex.Matches(input, @"(?i)(?<=(?:dev|fq) #)\d+");

请注意如何在字符串之前使用@来创建所谓的逐字字符串,这样您就不必双重转义所有内容。

答案 1 :(得分:1)

我认为你的模式可以简单地说:

"\(.*?\#(\d*)\)"

这将与括号中的组匹配并返回数字。

 var m = Regex.Match(input, @"\(.*?\#(\d*)\)");
 if (m.Groups.Count > 0)
 {
     string matchedNumber = m.Groups[1].Value;
 }