我正在尝试构建一个正则表达式,它将检查字符串是否有连字符 0 或 1 次。
所以它会返回以下字符串。
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
.
也许更简单的东西:
var hyphens = input.Count(cc => cc == '-');
您的正则表达式有效,因为它找到了符合您条件的连字符的第一个实例。您可以使用以下正则表达式,但这并不理想:
^[^-]*-?[^-]*$
如果您将字符串放在集合中,则可以在一行 LINQ 中执行此操作。它将返回一个包含少于两个连字符的字符串列表。
var okStrings = allStrings.Where(s => s.Count(h => h == '-') < 2).ToList();
从您格式化字符串列表的方式来看,我假设您不能在逗号上拆分,因为它不是一致的分隔符。如果可以,那么您可以使用该String.Split
方法获取每个字符串并将allStrings
上面的变量替换为该数组。
你可以这样处理:
string StringToSearch = "1-3-5";
MatchCollection matches = Regex.Matches("-", StringToSearch);
if(matches.Count == 0 || matches.Count == 1)
{
//...
}
我刚刚测试了你的表达,它似乎给出了你想要的结果。它将 1-3-5 分解为 {1-3} 和 {-5}