我一直在把头发拉过来,我觉得我很接近它的实际工作,但我似乎无法做到。
我一直在尝试使用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
答案 0 :(得分:2)
尝试以下表达式:
(?<=(?:dev|fq) #)\d+
(?<=)
:这是为了确保数字前面有后面的内容。(?:dev|fq)
:匹配dev
或fq
。#
:匹配一个后跟哈希#
。\d+
:匹配一个或多个数字。启用不区分大小写模式,因此dev
和fq
在所有情况下均可匹配。
您可以在正则表达式本身中转换不区分大小写,如下所示:
(?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;
}