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

本文关键字:正则表达式 模式 | 更新日期: 2023-09-27 17:56:28

问题:在 C# 正则表达式模式中,我应该将*'*''*放在何处以匹配目标中的星号?

'?''?同上

详情...

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

  • 一个或两个十六进制字符:0-9a-fA-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,或*,**,?,??,

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

例。。。

00, ??, 33, A7,    21, 14, ?,?, 30,30,30,31, **,    3e,3e,3e,  *, 5A,   0 

在这里阅读了 20 或 30 个类似的帖子后,我仍然无法弄清楚将'*'?序列放在pattern字符串中的哪个位置。

我也尝试了''*,但一无所获。

这包括在f之后,在$之前,在括号内的s*(任何一个)之后,括号外;我想我可以对我的文本编辑器进行编程,以制作相关行的五十一个副本并尝试每个位置;但我真的想理解这一点,而不仅仅是让它发生。

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

感谢任何可以回答这个问题的人。

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

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

^'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);