允许在C#正则表达式模式中使用星号和问号

允许在C#正则表达式模式中使用星号和问号,c#,regex,pattern-matching,C#,Regex,Pattern Matching,问题:我应该将*或\*或\\*放在C#RegEx模式的哪里,以匹配目标中的星号 \?或\\? 细节 我有一个允许这种输入的应用程序 一个或两个十六进制字符:0-9,或a-f,或a-f 然后是一个必需的逗号:, 然后选择空白(根据需要多或少,或无): 速记描述 0,通过F,以及00,通过FF,忽略字母的大小写。可选的前后空格都可以。分隔需要逗号,但结尾不允许使用逗号。(最后一个字符必须是空白或文本结尾) 之后,该模式可以根据用户的需要重复多次。(空格不必平衡。) 例如 00, F1, 33,

问题:我应该将
*
\*
\\*
放在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 
00, ??, 33, A7,    21, 14, ?,?, 30,30,30,31, **,    3e,3e,3e,  *, 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
、或
*、
*、
?、

(同样,每个字符串前后[但不在]都有零到随机空格,逗号强制)

例如

 00, F1, 33, A7,    21, 14, 0D, 0A, 30,30,30,31, 41,    3e,3e,3e,  41, 5A,   0 
00, ??, 33, A7,    21, 14, ?,?, 30,30,30,31, **,    3e,3e,3e,  *, 5A,   0 
在阅读了这里的20或30篇类似文章之后,我仍然不知道将
\*
\?
序列放置在
模式
字符串中的什么位置

我也试过
\\*
,但一无所获

这包括在
f
之后、在
$
之前、在
s*
之后、在括号内、括号外;我想我可以编写我的文本编辑器,将有问题的行复制51份,然后尝试每个位置;但我真的想理解这一点,而不仅仅是让它发生

如果有人能解释什么去了哪里,谢谢,那就行了。我真正想知道的是,这是在哪里解释和记录的。我将省略我访问过的十几个网页,这些网页旨在解释这一点


感谢所有能回答这个问题的人。

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

^\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*)*$"
现在,如果您想同时允许
*
,您可以使用如下内容:

@"^\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);

^\s*([0-9A-Fa-f\?\*]{1,2}\s*)*[0-9A-Fa-f\?\*]{1,2}\s*$
@User.1嗯,如果你认为
0*,f?
是有效的,那么你可以选择这个。等等!萨布吉,还有杰瑞,你们都把我想得太多了。这确实是一个比我最初设想的更好的答案。
F*
将是该模式的一个很好的补充。事实上,
F*
F?
可能意味着同样的事情,并在匹配标准上给我更多的空间。你可以再看一次上下文,我现在必须有两个例程;一个用于检查我的发送数据,另一个用于检查框返回的数据。干得好,伙计们!太糟糕了,我不能做
?F
*F
@User.1如果你想将两个正则表达式混合使用,那么我建议
@s*([0-9A-F][0-9A-F*?)(,\s*([0-9A-F][0-9A-F*?)\s*)*$”
@User.1如果你不想在你的代码输入中使用
>F
/F*,
/F*,
*
正好位于正则表达式中的
^
字符之后。这意味着如果前面没有匹配的
?f
*a
。再次非常好。嗯哼;现在我必须选择一个答案,你们都很好。@User.1这一个很完美。@SabujHassan是的,但看看我对你们关于Jerry关于。。。(现在我知道他们为什么称之为堆栈溢出)。在你们之间,你们已经改进了我的算法;20分钟后。@User.1好吧,至少你有选择权。我的答案中的小分组和替换将不允许使用带通配符的十六进制,但我建议对分组进行更改,以将速度提高一点!Sabuj说这个答案很完美,所以我会检查这个答案。真的,是你们俩。非常感谢。