匹配特定打印机命令模式

时间:2015-07-14 16:51:02

标签: c# .net

我将向打印机发送一些这种格式的命令。

{AA00:00;|}
{AAB08:02;|}

其中{始终是第一个字符,}始终是结束字符,|始终是最后一个字符。在这些之间我会有特定的命令AA00:00;这可能会有所不同。

我想在正则表达式中检查这些格式,我是regex的新手,我们将不胜感激。

3 个答案:

答案 0 :(得分:3)

更新

我误读了你对数字的评论,并且认为逗号是可以接受的。

尝试这种模式

"^{[A-Z]+\\d+:\\d+;\\|}$"

故障:

  • ^ - 行的开头
  • {[A-Z]+ - 一个以1个或多个大写字母后跟的空心括号
  • \\d+ - 一个或多个号码
  • : - 冒号角色
  • ; - 分号字符
  • \\|} - 竖线字符后面跟着括号
  • $ - 行尾

代码示例:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string[] commands = 
        {
            "{AA00:00;|}",
            "{ABC0:93;||}",
            "{AAB08:02;|}",
            "{123AA:AA;|}",
            "{AA123,123:123,123;|}"
        };

        foreach (string command in commands)
        {
            if (Regex.Match(command, "^{[A-Z]+\\d+:\\d+;\\|}$").Success)
            {
                Console.WriteLine("Good command");
            }
            else 
            {
                Console.WriteLine("Bad command");
            }
        }
    }
}

结果:

Good command
Bad command
Good command
Bad command
Bad command

Demo

答案 1 :(得分:2)

更容易理解的模式怎么样?

^{[A-Z]+\d+:\d+;\|}$";

  • ^ - 行的开头,不会在文本中移动(搜索);
  • { - 文字大括号。
  • [A-Z]+[ ] A-Z中的大写字母,其中一个或多个+
  • \d+一个数字(0-9)\d,其中一个或多个+
  • : - 字面冒号
  • \d+一个数字(0-9)\d,其中一个或多个+
  • ; - 字面分号
  • \| - 为正则表达式解析器转义的文字管道,而不是C#解析器
  • } - 文字大括号。
  • $ - 数据中正则表达式解析的结束;

注意我使用+因为它避免了*(零或更多)的问题,因为我们可以提供正则表达式解析器的提示越多,它执行得越快。 1或更多优于零或更多,因为它可能导致解析器回溯其他可能的组合。我们希望尽可能简洁。

<强>代码

var pattern = @"^{[A-Z]+\d+:\d+;\|}$";

var commands = new List<string>()
        {
            "{AA00:00;|}",            // Good
            "{ABC0:93;||}",           // Bad too many '|'
            "{AAB08:02;|}",           // Good
            "{123AA:AA;|}",           // Bad can't start with a number
            "{1111:11;|}",            // Bad
            "{*A11:11;|}",            // Bad
            "{AA123,123:123,123;|}"   // Bad can't have a comma
        };

commands.Select (cmd => string.Format("{0,-25} : {1}", 
                                      cmd, 
                                      Regex.IsMatch(cmd, pattern) ? "Valid" : "Not Valid"))
        .ToList()
        .ForEach(result => Console.WriteLine (result));

<强>结果

{AA00:00;|}               : Valid
{ABC0:93;||}              : Not Valid
{AAB08:02;|}              : Valid
{123AA:AA;|}              : Not Valid
{1111:11;|}               : Not Valid
{*A11:11;|}               : Not Valid
{AA123,123:123,123;|}     : Not Valid

答案 2 :(得分:0)

您可以使用此正则表达式:{\w{2}\d{2}:\d{2};\|}

  • \w{2}:此模式找到两个alfanumeric chars;
  • \d{2}:此模式找到两个数字字符;
  • \|:此模式找到字符&#34; |&#34;。
相关问题