【问题标题】:Allowing Asterisks And Question Marks In A C# RegEx pattern在 C# RegEx 模式中允许使用星号和问号
【发布时间】:2014-04-02 19:01:18
【问题描述】:

问题:我应该将*\*\\* 放在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,或*,**,?,??,

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

示例...

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

在这里阅读了 20 或 30 篇类似的帖子后,我仍然不知道将 \*\? 序列放在 pattern 字符串中的哪个位置。

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

这包括在f 之后、$ 之前、s* 之后(任一)在括号内、括号外;我想我可以对我的文本编辑器进行编程,使其复制 51 个有问题的行并尝试每个位置;但我真的很想了解这一点,而不仅仅是让它发生。

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

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

【问题讨论】:

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

标签: c# regex pattern-matching


【解决方案1】:

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

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

【讨论】:

  • @User.1 嗯,如果您对0*, F? 有效,那么您可以选择这个。
  • 等一下! Sabuj 和 Jerry,你们俩都想我了。这确实是对我最初设想的更好的答案。 F* 将是该模式的一个很好的补充。事实上,F*F? 可能是同一个意思,并在匹配标准上给我更多空间。您可以查看上下文HERE 好吧,我现在必须同时拥有这两个例程;一个检查我的 SEND 数据,这个检查框返回的数据。伟大的工作家伙!
  • 太糟糕了,我做不到 ?F*F
  • @User.1 如果您想将两个正则表达式混合用于该特定目的,那么我建议@"^\s*([0-9A-F][0-9A-F*?]?)(,\s*([0-9A-F][0-9A-F*?]?)\s*)*$"
  • @User.1 如果您不想在输入中允许?F*F,那么只需将(?!.*[?*][a-zA-Z]) 放在正则表达式中的^ 字符之后。表示如果前面没有?f*a匹配。
【解决方案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);

【讨论】:

  • 再次优秀。嗯嗯;现在我必须选择一个答案,你们俩都很棒。
  • @User.1 这个很完美。
  • @SabujHassan 是的,但是看看我的 cmets 关于你的 cmets 关于 Jerry 的 cmets 关于......(现在我知道他们为什么称之为堆栈溢出)。在你们两个之间,你们已经改进了我的算法; 20 分钟内。
  • @User.1 好吧,至少你有选择。我的答案中的小分组和交替不允许使用带有通配符的十六进制,但我建议更改分组以提高速度!
  • Sabuj 说这个答案很完美,所以我会检查这个答案。真的,是你们俩。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 2012-12-26
  • 1970-01-01
相关资源
最近更新 更多