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

C# 正则表达式将字符串中的连字符匹配0或1次,c#,regex,C#,Regex,我正在尝试构建一个正则表达式,它将检查字符串是否有连字符0或1次 因此它将返回以下字符串作为ok 1-5 1,3-5 1,3 以下是错误的 1-3-5 我尝试过以下方法,但1-3-5也可以: ([^-]?-){0,1}[^-] 这项工作: ^[^-]*-?[^-]*$ ^^ ^ ^ ^ || | | | || | | |-- Match the end of string || | |------- Match zero or more non-h

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

因此它将返回以下字符串作为ok

1-5
1,3-5
1,3
以下是错误的

1-3-5
我尝试过以下方法,但1-3-5也可以:

([^-]?-){0,1}[^-]
这项工作:

^[^-]*-?[^-]*$
^^    ^ ^    ^
||    | |    |
||    | |    |-- 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-3-5

这样的字符串的多个匹配项。您可以这样处理:

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

也许更简单一些:

var hyphens = input.Count(cc => cc == '-');
正则表达式之所以有效,是因为它找到了符合条件的连字符的第一个实例。您可以使用以下正则表达式,但这并不理想:

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

如果在集合中有字符串,则可以在LINQ的一行中执行此操作。它将返回少于两个连字符的字符串列表

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

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

我刚刚测试了您的表达式,它似乎给出了您想要的结果。它把1-3-5分成{1-3}和{-5}


你不能用另一种方法:如果字符串包含两个连字符,创建一个匹配的正则表达式吗?还有,这真的是你想要做的吗?完全解析字符串(数字、逗号、所有内容)难道没有意义吗?我可能会在
上拆分,然后在每个组件上使用regex/count-这是基于
1-2,4-5
也有效的假设,即使没有这样显示。将匹配“多个破折号”的正则表达式划分为组件时,其简单程度如下
-.*.-
(如果匹配多个破折号);但是,如果还需要提取值,则考虑从接受输入与拒绝破折号方法开始。