正则表达式匹配字符串中的连字符0或1次

时间:2013-06-17 17:08:25

标签: c# regex

我正在尝试构建一个正则表达式,它将检查字符串是否有连字符0或1次。

所以它会返回以下字符串。

1-5
1,3-5
1,3

以下是错误的。

1-3-5

我已尝试过以下内容,但1-3-5可以正常使用

([^-]?-){0,1}[^-]

5 个答案:

答案 0 :(得分:10)

这有效:

^[^-]*-?[^-]*$
^^    ^ ^    ^
||    | |    |
||    | |    |-- Match the end of string
||    | |------- Match zero or more non-hyphen characters
||    |--------- Match zero or one hyphens
||-------------- Match zero or more non-hyphen characters
|--------------- Match the beginning of string

在这种情况下,您需要指定匹配输入字符串的开头(^)和结束($),这样就不会为像{{{{{{ 1}}。

答案 1 :(得分:5)

也许更简单:

var hyphens = input.Count(cc => cc == '-');

您的正则表达式有效,因为它找到符合您条件的连字符的第一个实例。您可以使用以下正则表达式,但这不是理想的:

^[^-]*-?[^-]*$

答案 2 :(得分:2)

如果你的字符串在一个集合中,你可以在一行LINQ中完成。它将返回一个字符串列表,其中包含少于两个连字符。

var okStrings = allStrings.Where(s => s.Count(h => h == '-') < 2).ToList();

根据您格式化字符串列表的方式来判断我假设您不能在逗号上拆分,因为它不是一致的分隔符。如果可以,那么您可以使用String.Split方法获取每个字符串,并将上面的allStrings变量替换为该数组。

答案 3 :(得分:0)

你可以这样接近它:

string StringToSearch = "1-3-5";
MatchCollection matches = Regex.Matches("-", StringToSearch);
if(matches.Count == 0 || matches.Count == 1)
{
  //...
}

答案 4 :(得分:-2)

我刚测试了你的表情,它似乎给你想要的结果。它将1-3-5分为{1-3}和{-5}

http://regexpal.com/