首页 > 解决方案 > 在 C# 的正则表达式中,前导和尾随破折号不匹配

问题描述

我想匹配字母数字或破折号(“-”)字符。

@"\b(?<alphaOrDash>[\-\w]{5})\b"只要破折号不是前导或尾随破折号,我的天真模式似乎就匹配字母数字破折号字符串。

谁能让我深入了解这个难题。我的期望是前导或尾随破折号应该没有区别,我应该能够匹配前导和尾随破折号。我哪里错了?

示例上述问题的代码(我在 LINQPad 中编写了此代码,在 VS2017 中得到了相同的结果):

var textDashInMiddle = "123-4";
var patMatch5 = @"\b(?<fiveChars>[\-\w]{5})\b";
var reMatch5 = new Regex(patMatch5);
var match5 = reMatch5.Match(textDashInMiddle);
if (match5.Success)
    Console.WriteLine($"1.  {match5.Groups["fiveChars"].Value}");
else
    Console.WriteLine("1.  No success");

var textDashAtEnd = "1234-";
match5 = reMatch5.Match(textDashAtEnd);
if (match5.Success)
    Console.WriteLine($"2.  {match5.Groups["fiveChars"].Value}");
else
    Console.WriteLine("2.  No success");

var textDashInTheBeginning = "-1234";
match5 = reMatch5.Match(textDashInTheBeginning);
if (match5.Success)
    Console.WriteLine($"3.  {match5.Groups["fiveChars"].Value}");
else
    Console.WriteLine("3.  No success");

var patMatchAll = @"\b(?<fiveChars>[\-\w]+)\b";
//var patMatchAll = @"\b(?<fiveChars>(\-|\w)+)\b";
var reMatchAll = new Regex(patMatchAll);
var matchAll = reMatchAll.Match(textDashInMiddle);
if (matchAll.Success)
    Console.WriteLine($"4.  {matchAll.Groups["fiveChars"].Value}, {matchAll.Groups["fiveChars"].Value.Length}");
else
    Console.WriteLine("4.  No success");

matchAll = reMatchAll.Match(textDashAtEnd);
if (matchAll.Success)
    Console.WriteLine($"5.  {matchAll.Groups["fiveChars"].Value}, {matchAll.Groups["fiveChars"].Value.Length}");
else
    Console.WriteLine("5.  No success");

matchAll = reMatchAll.Match(textDashInTheBeginning);
if (matchAll.Success)
    Console.WriteLine($"6.  {matchAll.Groups["fiveChars"].Value}, {matchAll.Groups["fiveChars"].Value.Length}");
else
    Console.WriteLine("6.  No success");

运行上述代码的结果是:

1.  123-4
2.  No success
3.  No success
4.  123-4, 5
5.  1234, 4
6.  1234, 4

谢谢

标签: c#regex

解决方案


据我所知,这种模式应该可以工作:

[a-zA-Z0-9\-]{5}

您只需定义一个包含字母数字字符和破折号的字符类,然后查找多个组合在一起的字符(在本例中为 5 个)...这将返回 -1234、123-4、1234- 等。


推荐阅读