5

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

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

1-5
1,3-5
1,3

以下将是错误的。

1-3-5

我尝试了以下方法,但 1-3-5 没问题:

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

5 回答 5

12

这有效:

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

于 2013-06-17T17:13:45.713 回答
5

也许更简单的东西:

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

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

^[^-]*-?[^-]*$
于 2013-06-17T17:14:12.963 回答
2

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

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

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

于 2013-06-17T17:14:35.787 回答
0

你可以这样处理:

string StringToSearch = "1-3-5";
MatchCollection matches = Regex.Matches("-", StringToSearch);
if(matches.Count == 0 || matches.Count == 1)
{
  //...
}
于 2013-06-17T17:14:11.103 回答
-2

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

http://regexpal.com/

于 2013-06-17T17:14:37.813 回答