【问题标题】:Are these the proper regex expressions这些是正确的正则表达式吗
【发布时间】:2012-08-21 18:42:21
【问题描述】:

我正在尝试制作一些正则表达式字符串以在我的语法荧光笔中使用,如果我第一次使用它们并且我遇到了很多困难...

前四个是,我将有一个指定的字符后跟任意数量的数字,匹配它。

  • 我最好的方法是"G[0-9]|G[0-9][0-9]|G[0-9][0-9][0-9]" 匹配G#G##G###

但我想在 G 后面加上任意数量的数字。

接下来的三个是,我将有一个字符(X、Y、Z 或 P),如果后面没有字母或符号,我想匹配它

  • "[X|Y|Z|P][0-9]"

接下来的几个更难,匹配"#11.11=11.11",其中 1 是一个数字,井号、句点和等号之间可以有任意数量的数字。句号也可以是"#11=11"" #1.1=11""#11=1.1"

  • 我不知道..."#[0-9][ |.] ..."

" ' " 之后和换行符之间的任何内容

  • '[A-Za-z0-9]\n" 但我知道这只给了我一个字符...

我认为最简单的方法是介于两个 ()[] 之间

  • "(*) | [*]"?

【问题讨论】:

标签: c# regex


【解决方案1】:

快速而肮脏,但使用正则表达式测试

1) G[0-9]{1-3} - '{1-3}' 指定最后一个符号出现一到三次。

2) ((.*|)) - 在 '(' 和 ')' 之前放置一个 '\' 作为转义字符

3) [0-9]1*(.|)1*=1*(.|)1 - 这与您的三个示例相匹配

4) \'.*\n - 我认为这应该可行...'\n' 代表一个新行字符对吗?

5) ((|[).*()|]) - 这个又有转义字符

再次...又快又脏。 Regexpal.com 是你的朋友

【讨论】:

  • 5 号有问题 - 您的正则表达式将验证 "[qwe)" (左括号和右括号是不同的类型),我不确定它是否是 dto。
  • 嗯......这些答案都非常好并且有效。但是,更大的问题是我如何告诉 MVS \d 不应该是转义字符?它认为我的字符串(正则表达式)有无法识别的转义字符
  • 使用逐字字符串 (@"\d") 或双转义反斜杠 ("\\d")。
  • 这很有用,但对于第一个,OP 希望匹配任意数量的数字,而不仅仅是一到三个数字。
  • @spots [0-9]+\d+ 如果 OP 想要一个或多个,我认为 OP 会更准确。
【解决方案2】:

1> G[0-9]{1,3}

2> 不,这是错误的。 正确的是 [XYZ][0-9] (您不使用 OR 运算符 (|),而只是将字符并排写在方括号内)

【讨论】:

  • 他们使用的方式不是“错误”,而是不够简洁。两种方法都会得到相同的结果。
  • 如果我只想匹配 X,但前提是它后面有一个字母。
【解决方案3】:

您应该真正了解如何使用正则表达式。话虽如此:

我将有一个指定的字符后跟任意数量的数字,匹配它

G\d+

我将有一个字符(X、Y、Z 或 P),如果有,我想匹配它 后面没有字母或符号

(?<!\w)[XYZP][0-9]

接下来的几个更难,把“#11.11=11.11”变成蓝色

嗯?

“'”之后和换行符之间的任何内容

'(.+?)\n

我认为最简单的是介于两个 () 或 [] 之间的任何内容

\(.+?\)|\[.+?\]

【讨论】:

    【解决方案4】:

    我认为最简单的是介于两个 () 或 [] 之间的任何内容

    "(*) | [*]"?
    

    @"\([^(]*\)"@"\[[^\[]*\]"

    这意味着:一个左括号 - 然后是任意数量的不是左括号的字符 - 和一个右括号。

    需要斜杠以向正则表达式引擎指示括号应按字面意思处理。

    " ' " 之后和换行符之间的任何内容

    同理:@"'[^']*\n"

    【讨论】:

      【解决方案5】:
      1. G\d+
      2. [XYZP](?=\d)
      3. #(\d+(\.\d+)?)=(\d+(\.\d+)?)
      4. '.*?\n
      5. \(.*?\)|\[.*?\]

      Regex explanation here.

      【讨论】:

        【解决方案6】:

        第一个:

        G[0-9]+
        

        在正则表达式中,+ 表示至少 1 个或多个(重复前面的“字符”)。 您也可以使用* 不重复或不重复次数。

        第二个可能是这样的:

        ^(X|Y|Z|P)$
        

        这实际上只有在它位于一行的开头并且后面有 no 个字符时才匹配。如果您希望它位于任何位置并且仅排除其后面的某些字符,请修改以下内容:

        [XYZP][^0-9a-z]
        

        这是 X 或 Y 或 Z 或 P 后跟 NOT 0-9 和 NOT a-z

        请注意,我在第一个示例中的括号中使用了 OR 字符 |,但没有在方括号中。

        第三个:

        #[0-9]+\.[0-9]+=[0-9]+\.[0-9]+
        

        可能不是 100% 正确,我总是混淆何时转义哪些字符。您可能需要转义 #=

        最后一个:

        (\(.*\)|\[.*\])
        

        【讨论】:

          【解决方案7】:

          第一个你可以使用这个正则表达式:

          ^G\d+
          

          【讨论】:

          • 假设他希望它以换行符开头。
          【解决方案8】:

          对于后面有任意位数的 G

          \b([Gg]\d+)\b
          

          这匹配一个字边界 (\b) 后跟一个较低或较高的 G [Gg],后跟 1 个或多个 (+) 数字 (\d),然后是一个字边界 (\b)

          接下来的三个是,我将有一个字符(X、Y、Z 或 P)并且我想要 如果后面没有字母或符号,则匹配它

          这个有点难

          \b[XYZP]([\W]|_)
          

          这匹配一个 XYZ 或 P 后跟一个非单词字符 \W,(单词字符通常是 a-z、0-9 和下划线),所以在说我们不想要单词字符之后,我们添加_ 是允许的。

          【讨论】:

            【解决方案9】:

            我将 perl 用于正则表达式,但希望它与您要查找的内容相同。

            对于第一个,G[0-9]+ 应该可以工作。方括号表示正则表达式仅查找括号内的一个字符(字符为 0 到 9),紧随其后的 + 表示它查找一个或多个匹配项。

            第二个有点棘手,但我会使用\s[XYPZ]。方括号的功能与以前相同,仅匹配 X、Y、P 或 Z 之一。此外,\s 匹配任何空白字符(制表符、空格、换行符等)。

            对于第三个,我会尝试#[0-9]+\.?[0-9]+=[0-9]+\.?[0-9]+。如果我们从左到右,我们会遇到\.?,它是新的。 \. 匹配文字句点(您必须使用反斜杠对其进行转义,因为句点本身意味着它可以匹配任何字符之一)。问号表示句点可以存在或不存在(匹配零个句点或一个句点实例)。

            第四个:'.*\n。句点本身和星号的组合意味着它将匹配零个或多个字符,字符可以是任何字符。不过,我不太确定您是否需要转义单引号。

            对于第五个,(\(.*\)|\[.*\]) 应该可以解决问题。您需要转义括号内的[](),因为它们本身就意味着一些东西。此外,| 表示或,因此正则表达式可以匹配栏左侧或右侧的任何内容。

            【讨论】:

              【解决方案10】:

              您可以用不同的方式指定重复。术语后的星号“*”表示将该术语重复零次、一次或多次。加号“+”表示将该术语重复一次或多次。您还可以使用{n,m} 指定数字范围。在你的情况下,表达式是

              G\d{1-3}
              

              \d 是一个数字。


              使用此表达式,您可以匹配不位于后缀之前的位置

              find(?!suffix)
              

              我不知道你说的符号是什么意思

              [XYZP](?![a-zA-Z specify your symbols here])
              

              磅数

              \#\d+(\.\d+)?=\d+(\.\d+)?
              

              \# 井号
              \d+ 至少一位数字 (\.\d+)? 可选 (?) 句点后跟至少一位数字 最后一个等号后接另一个数字


              "'" 和 \n 之间的所有内容。在这里使用这个模式,它会在前缀和后缀之间找到一个位置。

              (?<=prefix)find(?=suffix)
              
              (?<=').*(?=\n)
              

              .* 表示任何字符尽可能多次。或者你可以使用

              (?<=').*?(?=\n)
              

              .* 表示任何字符尽可能少出现,如果太多\n 被占用。还要小心 RegexOption.Multiline。根据其设置,您必须使用$ 而不是\n 测试行尾。


              对于括号 () 或 [],您可以再次使用相同的模式

              (?<=prefix)find(?=suffix)
              
              (?<=\().*?(?=\))|(?<=\[).*?(?=])
              

              | 是替代方案。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-02-20
                • 2012-06-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-03-18
                • 1970-01-01
                • 2013-04-07
                相关资源
                最近更新 更多