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

4

我一直为此苦恼,但我认为我已经接近成功了,但似乎还差一点。

我一直在尝试使用正则表达式从字符串中提取特定的子字符串。这个子字符串必须与一定的字符串/数字匹配。然后,在此之后,它应该被返回到另一个函数,该函数仅提取数字。

这里有一些存在的字符串示例:

"(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个回答

3
尝试以下表达式:
(?<=(?:dev|fq) #)\d+
  • (?<=): 这是后行断言,确保数字前面符合后行断言中的条件。
  • (?:dev|fq): 这匹配 dev 或者 fq
  • #: 匹配紧跟着空格后面的井号 #
  • \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
啊,太棒了,这个很好用!非常感谢,我发现我的实现离正确还有很大差距! - BobbyDazzler
@MightyLampshade 没问题,很高兴能帮到你。 - Ibrahim Najjar
1
你可以使用 (?i:dev|fq),而不是使用 (?i) - Pierluc SS
1
@PierlucSS 感谢您的反馈,我不知道您可以将标志嵌套在非匹配组内,我希望我能为此给您投票,因为您值得拥有它。 - Ibrahim Najjar

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

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

这将匹配括号中的组并返回数字。
 var m = Regex.Match(input, @"\(.*?\#(\d*)\)");
 if (m.Groups.Count > 0)
 {
     string matchedNumber = m.Groups[1].Value;
 }

1
啊,是的,这个可以用,它返回了 DEV #<number> 和数字本身。两个答案都很好,但我只能标记一个为正确的 :( 否则我会标记你们两个。 - BobbyDazzler
没问题,我很高兴能帮到你。 - Szymon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接