6

我对 RegEx 很陌生 - 所以有人可以帮我弄清楚这里到底出了什么问题吗?

我有这个代码:

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

然而,当我的应用程序遇到 regExPattern 行时,我得到一个 ArgumentException -- Quantifier {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

        }

如果将模式传递到此循环中,我如何定义模式?

4

5 回答 5

7

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

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

旧答案:我猜你在写的时候*会想到通配符,比如你会在 shell 中输入的通配符:

*。文本

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

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

.意思是“任何字符”,意思*是“前面的零个或多个”。

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

于 2010-06-28T19:41:55.850 回答
2

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

于 2010-06-28T19:43:01.667 回答
0

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

        string pattern = "[~#%&*{}/()<>?|\"\\\\-^[\\]]";

        string input = @"(*&af%\#$}afd]a#f%hjg{d(^(^[RF*()^FR(7r5";

        string output = Regex.Replace(input, pattern, String.Empty);
于 2010-06-28T20:01:07.393 回答
0

.在前面加上*

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

于 2014-06-03T13:46:07.310 回答
0

通配符 * 在这里单独无法正常工作我尝试了它并使其正常工作,我们需要在.前面添加一个完整的*,因为.*这应该可以工作。

于 2021-04-09T15:02:57.890 回答