在C#RegEx模式中允许使用星号和问号

时间:2014-04-02 19:01:19

标签: c# regex pattern-matching

问题:我在哪里将*\*\\*置于C#RegEx模式中以匹配目标中的星号?

同样适用于\?\\?

详细信息 ...

我有一个允许这种输入的应用

  • 一个或两个十六进制字符:0-9,或a-f,或A-F
  • 然后是强制性逗号:,
  • 然后是可选的空格(根据需要尽可能多或没有):

速记说明......

0,F,以及00,FF,忽略了这些字母的情况。之前和之后的可选空格都可以。分隔需要逗号,但最后不允许使用逗号。 (最后一个字符必须是空格或文本结尾)

之后,模式可以根据用户的需要重复。 (空白无需平衡。)

示例...

 00, F1, 33, A7,    21, 14, 0D, 0A, 30,30,30,31, 41,    3e,3e,3e,  41, 5A,   0 

以下代码适用于此...

 private bool See_If_This_Input_Is_Okay(string The_Callers_Text)
    {
        String pattern = @"^\s*([0-9A-Fa-f]{1,2},\s*)*[0-9A-Fa-f]{1,2}\s*$";

        bool matches = Regex.IsMatch(The_Callers_Text, pattern);

        return (matches);
    }

现在我想让模式适应......

  • 一个或两个相邻的星号:***,然后是强制逗号:,
  • 一个或两个相邻的问号:???,然后是强制逗号:,

速记说明......

0,F,00,FF,或*,**,?,或{{1} }

(同样在每个字符串之前和之后都有零到随机的空格,强制执行逗号)

示例...

??,

在此处阅读了20或30个类似帖子之后,我仍然无法确定将00, ??, 33, A7, 21, 14, ?,?, 30,30,30,31, **, 3e,3e,3e, *, 5A, 0 \*序列放在\?字符串中的位置。

我也试过pattern并且无处可去。

包括\\*之后,f之前,括号内$之后(任何一个),括号之外;我想我可以编程我的文本编辑器来制作有问题的行的五十一个副本并尝试每个位置;但我真的很想理解这一点,而不仅仅是让它成为现实。

如果有人能解释什么在哪里,谢谢,那将会做。我真正想知道的是解释和记录的地方。我将遗漏我访问过的十几个网页,这些网页旨在解释这一点。

感谢能够回答此问题的任何人。

2 个答案:

答案 0 :(得分:3)

你的正则表达式中有两个字符类[]。只需将*?字符放在字符类中,它就适合您。

^\s*([0-9A-Fa-f*?]{1,2},\s*)*[0-9A-Fa-f*?]{1,2}\s*$
               ^^                      ^^

答案 1 :(得分:2)

嗯,首先,您可以通过将分组更改为以下内容来使正则表达式更快一些:

@"^\s*[0-9A-Fa-f]{1,2}(,\s*[0-9A-Fa-f]{1,2}\s*)*$"

现在,如果你想同时允许*?,你可以使用以下内容:

@"^\s*([0-9A-Fa-f]{1,2}|\*\*?|\?\??)(,\s*([0-9A-Fa-f]{1,2}|\*\*?|\?\??)\s*)*$"

我基本上将[0-9A-Fa-f]{1,2}更改为([0-9A-Fa-f]{1,2}|\*\*?|\?\??)

您也可以使用RegexOptions.IgnoreCase代替A-Fa-f

String pattern = @"^\s*([0-9A-F]{1,2}|\*\*?|\?\??)(,\s*([0-9A-F]{1,2}|\*\*?|\?\??)\s*)*$";
bool matches = Regex.IsMatch(The_Callers_Text, pattern, RegexOptions.IgnoreCase);