2011-10-01 71 views
1

这可能在某个地方被回答之前,但因为有数百万与字符串格式无关的帖子。检查字符串的格式

采取以下字符串:

24:东西(真,假,真)[0,1,0]

我希望能够做两件事情在这种情况下, 。我需要检查以下所有条件是否为真:

  • 只有一个:使用斯普利特(),我需要使用反正两个部分分开来实现。
  • 前的整数:是一个1-3位INT简单int.parse逻辑
  • 的()存在,并且所述“东西”,在这种情况下任何字符串少于10个字符,是否有
  • []存在并且至少有一个整数。此外,请确保[]中的元素是用整数分隔的整数,

我该如何做到最好? 编辑:我划掉了迄今为止取得的成就。

+0

为了检查一切后:我现在有两个拆分成字符串。 :之后的整个部分存储在一个字符串中,这将更容易检查。 –

+0

你想在()中做什么?真/假statemets由“,”分隔? –

回答

3

正则表达式是最快捷的方式。取决于复杂性,它也可能是计算量最大的。

这似乎是你需要什么(我没那么好,所以有可能是更好的方式来做到这一点):

^\d{1,3}:\w{1,9}\((true|false)(;true|;false)*\)\[\d(,[\d])*\]$

说明

\d{1,3} 1至3数字

: 后跟冒号

\w{1,9} 后跟一个1-9字符字母数字串

\((true|false)(;true|;false)*\) 后跟包含括号“真”或“假”,随后通过任何数量的“真”或“假” ,

\[\d(,[\d])*\] 后面跟着另一组包含数字的括号,后面跟着任意数量的逗号+数字。

在字符串的开头和结尾处的^和$表示字符串的开始和结尾,这是重要的,因为我们试图验证整个字符串与格式匹配。

代码示例

var input = "24:Something(true;false;true)[0,1,0]"; 

var regex = new System.Text.RegularExpressions.Regex(@"^\d{1,3}:.{1,9}\(.*\)\[\d(,[\d])*\]$"); 
bool isFormattedCorrectly = regex.IsMatch(input); 

信用@伊恩·尼尔森

+0

嗨,请参阅我已编入的编辑内容,并帮助我了解您的正则表达式的含义 - 我对他们来说很陌生。 –

+0

刚刚添加了几个' - 否则表达式中的* s被用作格式化指标... –

+1

您无法解释或阅读RegEx,您只需将其写入! :) – kenny

2

这是您唯一明智的选择是使用正则表达式的情况之一。

我草率的尝试是这样的:

var input = "24:Something(true;false;true)[0,1,0]"; 

var regex = new System.Text.RegularExpressions.Regex(@"^\d{1,3}:.{1,9}\(.*\)\[\d(,[\d])*\]$"); 

System.Diagnostics.Debug.Assert(regex.IsMatch(input)); 

This online RegEx tester should help refine the expression.

+0

我对Regex's很新,请更具体地帮助我。谢谢! –

+0

真棒,就是我正要去寻找测试。将现在使用... –

+0

非常好的答案。谢谢。我接受另一个,因为它有解释,但如果我能接受两个,我也会接受你的。 –

1

我认为,最好的办法是使用正则表达式是这样的:

string s = "24:Something(true;false;true)[0,1,0]"; 
Regex pattern = new Regex(@"^\d{1,3}:[a-zA-z]{1,10}\((true|false)(;true|;false)*\)\[\d(,\d)*\]$"); 

if (pattern.IsMatch(s)) 
{ 
    // s is valid 
} 

如果你想里面任何东西( ),您可以使用以下正则表达式:

@"^\d{1,3}:[a-zA-z]{1,10}\([^:\(]*\)\[\d(,\d)*\]$" 
+0

将使用此代码。谢谢。 –