C#中的正则表达式中不匹配的前导和尾部破折号

时间:2019-05-17 02:06:03

标签: c# regex

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

我的@"\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

谢谢

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

@madreflection在我将RE工作的边界字符(\ b)更改为(^)n($)时是正确的。到达那里后,我将检查我的工作表达。

谢谢大家