我对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
}
如果将模式传递到此循环中,如何定义模式?
答案 0 :(得分:6)
更新:在阅读了问题的评论后,我认为你只想这样:
s = Regex.Replace(s, "[~#%&*{}/<>?|\"-]+", "");
旧回答:我想当你写*
时,你正在考虑通配符,例如你要在shell中输入的那些:
* .txt的
这不是*
在正则表达式语法中的工作方式。您可能需要的是.*
:
".*[~#%&*{}/<>?|\"-]+.*"
.
表示“任何字符”,*
表示“之前为零或更多”。
在角色类[...]
内,*
失去了它的特殊含义,并成为一个文字角色,因此不需要进行转义。在角色类中不必要地逃避它不会造成任何伤害,有些人会发现它更容易阅读。
答案 1 :(得分:1)
*
是一个量词,意思是“零次或多次”(与{0,}
相同)。你必须使用这样的反斜杠来逃避它:\*
答案 2 :(得分:0)
因为您正在使用Regex.Replace来替换任何这些单字符匹配的空字符串:
string pattern = "[~#%&*{}/()<>?|\"\\\\-^[\\]]";
string input = @"(*&af%\#$}afd]a#f%hjg{d(^(^[RF*()^FR(7r5";
string output = Regex.Replace(input, pattern, String.Empty);
答案 3 :(得分:0)
在.
*
e.g。 string regPattern = ".*[~#%&*{}/<>?|\"-]+.*";
答案 4 :(得分:0)
通配符 * 单独在这里不能正常工作我尝试过并使其正常工作,我们需要在 .
之前添加一个 *
并且完全像 .*
这应该工作。