【问题标题】:Check Formatting of a String检查字符串的格式
【发布时间】:2011-10-01 21:35:19
【问题描述】:

这可能在以前的某个地方已经得到了回答,但是因为有数百万关于字符串格式的不相关帖子。

取以下字符串:

24:某事(真;假;真)[0,1,0]

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

  • 只有一个: 使用 Split() 实现,无论如何我都需要使用它来分隔两个部分。
  • :前面的整数是1-3位int简单的int.parse逻辑
  • 存在 (),并且存在“Something”,在这种情况下是任何少于 10 个字符的字符串
  • [] 存在并且其中至少包含 1 个整数。另外,请确保 [] 中的元素是由 , 分隔的整数,

我怎样才能最好地做到这一点? 编辑:我已经划掉了我迄今为止所取得的成就。

【问题讨论】:

  • 为了检查 : 之后的所有内容,我现在将两个拆分为字符串。 : 之后的整个部分存储在一个字符串中,这样更容易检查。
  • 你想在 () 中做什么?用“,”分隔的真/假语句?

标签: c# string format


【解决方案1】:

正则表达式是最快的方法。根据复杂性,它也可能是计算成本最高的。

这似乎可以满足您的需要(我不是那么好,所以可能有更好的方法来做到这一点):

^\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)*\) 后跟包含“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);

信用@伊恩·纳尔逊

【讨论】:

  • 您好,请查看我所做的编辑并帮助我理解您的正则表达式的含义 - 我对他们很陌生。
  • 刚刚添加了几个 ` - 否则表达式中的 *s 被用作格式化指示符...
  • 我...要去阅读正则表达式的 :) 希望我能够理解你所掌握的内容。顺便说一句,还有其他人认为这会正常工作吗?我会在这里测试一下..
  • 很好的解释。让我测试一下,我会在一秒钟内回复你。
  • 你会得到神奇的 cookie 来获得精彩的解释。非常感谢你们的帮助!
【解决方案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.

【讨论】:

  • 我对正则表达式很陌生,请更具体地帮助我。谢谢!
  • 非常好的答案。谢谢你。我接受另一个,因为它有解释,但如果我能接受两个,我也会接受你的。
  • @Ian,您的正则表达式不正确,它接受例如字符串:“24:Som:thing(true;false;true)[0,1,0]”,其中有两个“: "
  • @Lucasus 啊,真的,谢谢。我在精神上连续处理规则,所以我将“某事”部分匹配为“任何少于 10 个字符的字符串”,并且忘记了只有一个冒号的规则。正则表达式的危险!
【解决方案3】:

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

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)*\]$"

【讨论】:

    猜你喜欢
    • 2019-04-22
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多