我有一个应用程序进入,用空白替换“无效”字符(由我的正则表达式定义)。我想要它,以便如果文件名中有2个或更多空格,则修剪一个。例如:
Deal A & B.txt
我的应用程序运行之后,将被重命名为Deal A B.txt
(3位的B / W A和B)。我真正想要的是:Deal A B.txt
(A和B之间的一个空格)。
我正在尝试确定如何执行此操作 - 我想我的应用程序必须至少运行一次所有文件名以替换无效字符,然后再次运行文件名以消除无关的空白。
有人可以帮我吗? 这是我目前用于替换无效字符的代码:
public partial class CleanNames : Form
{
public CleanNames()
{
InitializeComponent();
}
public void Sanitizer(List<string> paths)
{
string regPattern = (@"[~#&$!%+{}]+");
string replacement = " ";
Regex regExPattern = new Regex(regPattern);
StreamWriter errors = new StreamWriter(@"S:\Testing\Errors.txt", true);
var filesCount = new Dictionary<string, int>();
dataGridView1.Rows.Clear();
try
{
foreach (string files2 in paths)
{
string filenameOnly = System.IO.Path.GetFileName(files2);
string pathOnly = System.IO.Path.GetDirectoryName(files2);
string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement);
string sanitized = System.IO.Path.Combine(pathOnly, sanitizedFileName);
if (!System.IO.File.Exists(sanitized))
{
DataGridViewRow clean = new DataGridViewRow();
clean.CreateCells(dataGridView1);
clean.Cells[0].Value = pathOnly;
clean.Cells[1].Value = filenameOnly;
clean.Cells[2].Value = sanitizedFileName;
dataGridView1.Rows.Add(clean);
System.IO.File.Move(files2, sanitized);
}
else
{
if (filesCount.ContainsKey(sanitized))
{
filesCount[sanitized]++;
}
else
{
filesCount.Add(sanitized, 1);
}
string newFileName = String.Format("{0}{1}{2}",
System.IO.Path.GetFileNameWithoutExtension(sanitized),
filesCount[sanitized].ToString(),
System.IO.Path.GetExtension(sanitized));
string newFilePath = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(sanitized), newFileName);
System.IO.File.Move(files2, newFilePath);
sanitized = newFileName;
DataGridViewRow clean = new DataGridViewRow();
clean.CreateCells(dataGridView1);
clean.Cells[0].Value = pathOnly;
clean.Cells[1].Value = filenameOnly;
clean.Cells[2].Value = newFileName;
dataGridView1.Rows.Add(clean);
}
}
}
catch (Exception e)
{
errors.Write(e);
}
}
private void SanitizeFileNames_Load(object sender, EventArgs e)
{ }
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Application.Exit();
}
}
问题是,重命名后并非所有文件都具有相同数量的空白空间。作中,我可以有Deal A&B.txt
,它的重命名后会成为Deal A B.txt
(1个空间的B / W A和B - 这是好的)。但是我也会有这样的文件:Deal A & B & C.txt
在重命名之后是Deal A B C.txt
(A,B和C之间有3个空格 - 不可接受)。
有没有人有任何关于如何实现这个目标的想法/代码?
答案 0 :(得分:5)
当地的等效物:
s/\s+/ /g;
答案 1 :(得分:4)
只需在regPattern中添加一个空格即可。任何无效字符和空格的集合都将替换为单个空格。您可能会浪费一点时间用空格替换空格,但另一方面您不需要第二次字符串操作调用。
答案 2 :(得分:2)
这有帮助吗?
var regex = new System.Text.RegularExpressions.Regex("\\s{2,}");
var result = regex.Replace("Some text with a lot of spaces, and 2\t\ttabs.", " ");
Console.WriteLine(result);
输出是:
Some text with a lot of spaces, and 2 tabs.
它只用一个空格替换任何2个或更多空格字符的序列......
编辑:
为了澄清,我只是在现有的正则表达式之后执行此正则表达式:
public void Sanitizer(List<string> paths)
{
string regPattern = (@"[~#&$!%+{}]+");
string replacement = " ";
Regex regExPattern = new Regex(regPattern);
Regex regExPattern2 = new Regex(@"\s{2,}");
和
foreach (string files2 in paths)
{
string filenameOnly = System.IO.Path.GetFileName(files2);
string pathOnly = System.IO.Path.GetDirectoryName(files2);
string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement);
sanitizedFileName = regExPattern2.Replace(sanitizedFileName, replacement); // clean up whitespace
string sanitized = System.IO.Path.Combine(pathOnly, sanitizedFileName);
我希望这更有意义。
答案 3 :(得分:1)
完成消毒后,只需用1个空格替换2个空格,而字符串中有2个空格。
while (mystring.Contains(" ")) mystring = mystring.Replace(" "," ");
我认为这是正确的语法......
答案 4 :(得分:1)
您可以在第一次正式替换后执行另一个正则表达式替换
@" +" -> " "
答案 5 :(得分:1)
正如Fosco所说,格式化:
while (mystring.Contains(" ")) mystring = mystring.Replace(" "," ");
// || || |