C#检查字符串中是否出现固定顺序

时间:2016-09-21 09:53:35

标签: c# string character

我需要检查用户输入是否与参数类似。它是一个字符串(不可更改),必须看起来像以下示例:

p123[2]      -> writable array index  
r23[12]      -> read only array index  
p3[7].5      -> writable bit in word  
r1263[13].24 -> read only bit in word  
15           -> simple value

允许用户输入任何一个,我的功能必须区分它们才能调用正确的功能。

一个想法是检查特定顺序的字符,例如“p []”,“r []”,“p []。”等。

但我不知道如何在不检查每个单个字符并使用多个案例的情况下存档...

欢迎任何其他关于如何确保用户输入正确的想法。

2 个答案:

答案 0 :(得分:0)

您可以检查输入是否与正则表达式匹配:

1 ) Regex.IsMatch(input,@"^p\d+\[\d+\]$"); // match p123[2] 
2 ) Regex.IsMatch(input,@"^r\d+\[\d+\]$"); // match r23[12] 
3 ) Regex.IsMatch(input,@"^p\d+\[\d+\]\.\d+$"); // match p3[7].5
4 ) Regex.IsMatch(input,@"^r\d+\[\d+\]\.\d+$"); // match r1263[13].24
5 ) Regex.IsMatch(input,@"^\d+$") ;// match simple value

答案 1 :(得分:0)

如果您只需要验证应该在5个提供的共振峰中的1个中的用户输入,请使用正则表达式检查:

Regex.IsMatch(str, @"^(?:(?<p>[pr]\d+)(?:\[(?<idx>\d+)])?(?:\.(?<inword>\d+))?|(?<simpleval>\d+))$")

请参阅regex demo

<强>描述

  • ^ - 字符串开头
  • (?: - 交替小组的开始
    • (?<p>[pr]\d+) - 小组&#34; p&#34;在
    • 之后捕获pr以及1位或更多位数字
    • (?:\[(?<idx>\d+)])? - [的可选序列,1个或多个数字(捕获到Group&#34; idx&#34;)然后]
    • (?:\.(?<inword>\d+)‌​)? - 文字.的可选序列,然后将1个或多个数字捕获到组&#34; inword&#34;
  • | - 或(然后是第二种选择)
  • (?<simpleval>\d+)‌​ - Group&#34; simpleval&#34;捕获一个或多个数字
  • ) - 外部分组的结束
  • $ - 字符串结束。

如果pr可以任何 ASCII字母,请使用[a-zA-Z]代替[pr]

C# demo

var strs = new List<string> { "p123[2]","r23[12]","p3[7].5","r1263[13].24","15"};
var pattern = @"^(?:(?<p>[pr]\d+)(?:\[(?<idx>\d+)])?(?:\.(?<inword>\d+))?|(?<simpleval>\d+))$";
foreach (var s in strs)
    Console.WriteLine("{0}: {1}", s, Regex.IsMatch(s, pattern));