【问题标题】:RegEx -- Quantifier {x,y} following nothing errorRegEx -- 量词 {x,y} 没有错误
【发布时间】:2010-06-28 19:40:43
【问题描述】:

我是 RegEx 的新手——所以有人可以帮我弄清楚这里到底出了什么问题吗?

我有这个代码:

       string regPattern = "*[~#%&*{}/<>?|\"-]+*";
       string replacement = "";
       Regex regExPattern = new Regex(regPattern);

然而,当我的应用程序遇到 regExPattern 行时,我得到一个 ArgumentException -- 量词 {x,y} 没有任何错误。

有人可以帮忙吗?

编辑:我需要像这样将这个模式传递给一个 foreach 循环:

    if (paths.Contains(regPattern))
        {
            foreach (string files2 in paths)
            {
                try
                {
                    string filenameOnly = Path.GetFileName(files2);
                    string pathOnly = Path.GetDirectoryName(files2);
                    string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement);
                    string sanitized = Path.Combine(pathOnly, sanitizedFileName);
                    //write to streamwriter
                    System.IO.File.Move(files2, sanitized);

                }
                catch (Exception ex)
                {
                    //write to streamwriter

                }
            }
        } 
        else
        { 
        //write to streamwriter

        }

如果模式被传递到这个循环中,我如何定义它?

【问题讨论】:

  • 具体来说——我在代码中使用的模式旨在消除文件名中的那些无效字符。因此我需要去掉星号、波浪号、井号、括号、尖括号等。这是正确的模式吗?

标签: c# regex argumentexception


【解决方案1】:

更新:在阅读了对问题的评论后,我认为您只想这样做:

s = Regex.Replace(s, "[~#%&*{}/<>?|\"-]+", "");

旧答案:我猜当您写 * 时,您会想到通配符,例如您将在 shell 中输入的通配符:

*.txt

这不是* 在正则表达式语法中的工作方式。你可能想要的是.*:

".*[~#%&*{}/<>?|\"-]+.*"

. 表示“任何字符”,* 表示“前一个字符的零个或多个”。

在字符类[...] 中,* 失去了它的特殊含义,变成了一个字面字符,所以它不需要被转义。在字符类中不必要地转义它不会造成任何伤害,而且有些人发现它更容易阅读。

【讨论】:

  • * 表示星号——不是任何字符。我还需要反斜杠吗?
  • * 的含义取决于它是否在字符类中。在字符类中,它表示文字*,无论它是否被转义。在字符类之外,如果未转义则表示“零或多个”,如果转义则表示文字 *。
  • +1(用于修订版),并且在 C# 中,您应该对正则表达式使用逐字字符串。他们不使用反斜杠作为转义字符;你只需要用另一个引号转义引号:@"[~#%&amp;*{}/&lt;&gt;?|""-]+"
【解决方案2】:

* 是一个量词,意思是“零次或多次”(与{0,} 相同)。您必须使用这样的反斜杠对其进行转义:\*

【讨论】:

    【解决方案3】:

    由于您正在执行 Regex.Replace 以将这些单字符匹配中的任何一个替换为空字符串:

            string pattern = "[~#%&*{}/()<>?|\"\\\\-^[\\]]";
    
            string input = @"(*&af%\#$}afd]a#f%hjg{d(^(^[RF*()^FR(7r5";
    
            string output = Regex.Replace(input, pattern, String.Empty);
    

    【讨论】:

      【解决方案4】:

      在*之前添加.

      例如string regPattern = ".*[~#%&amp;*{}/&lt;&gt;?|\"-]+.*";

      【讨论】:

        【解决方案5】:

        通配符 * 单独在这里不能正常工作我试过了,为了让它正常工作,我们需要在 * 之前添加一个 . 并且完全作为 .* 这应该可以工作。

        【讨论】:

          猜你喜欢
          • 2017-03-22
          • 2018-09-11
          • 2011-12-29
          • 1970-01-01
          • 2016-07-18
          • 2016-10-29
          • 2015-12-01
          • 2015-09-17
          相关资源
          最近更新 更多