如何使用正则表达式过滤无效文件名字符的字符串

时间:2016-07-25 11:05:42

标签: regex powershell powershell-v2.0

我的问题是我不希望用户键入任何错误,所以我试图将其删除,我的问题是我制作了一个正则表达式,删除除了单词之外的所有内容,并删除。 , - 但我需要这些标志才能让用户满意:D

简短摘要:此脚本使用正则表达式删除输入字段中的错误字符。

输入字段:

$CustomerInbox = New-Object System.Windows.Forms.TextBox #initialization -> initializes the input box
$CustomerInbox.Location = New-Object System.Drawing.Size(10,120) #Location -> where the label is located in the window
$CustomerInbox.Size = New-Object System.Drawing.Size(260,20) #Size -> defines the size of the inputbox
$CustomerInbox.MaxLength = 30 #sets max. length of the input box to 30
$CustomerInbox.add_TextChanged($CustomerInbox_OnTextEnter)
$objForm.Controls.Add($CustomerInbox) #adding -> adds the input box to the window 

功能:

$ResearchGroupInbox_OnTextEnter = {
if ($ResearchGroupInbox.Text -notmatch '^\w{1,6}$') { #regex (Regular Expression) to check if it does match numbers, words or non of them!
    $ResearchGroupInbox.Text = $ResearchGroupInbox.Text -replace '\W' #replaces all non words!
}

}

错误字符我不想出现:

~ " # % & * : < > ? / \ { | } #those are the 'bad characters'

3 个答案:

答案 0 :(得分:3)

要确保文件名有效,您应该使用GetInvalidFileNameChars .NET方法检索所有无效字符并使用正则表达式检查文件名是否有效:

[regex]$containsInvalidCharacter = '[{0}]' -f ([regex]::Escape([System.IO.Path]::GetInvalidFileNameChars()))

if ($containsInvalidCharacter.IsMatch(($ResearchGroupInbox.Text)))
{
    # filename is invalid...
}

答案 1 :(得分:2)

$ResearchGroupInbox.Text -replace '~|"|#|%|\&|\*|:|<|>|\?|\/|\\|{|\||}'

@Wiketor建议你可以将其排除在'[~"#%&*:<>?/\\{|}]+'

答案 2 :(得分:2)

请注意,如果您要替换无效的文件名字符,可以使用How to strip illegal characters before trying to save filenames?

中的解决方案

回答你的问题,如果你有特定的字符,把它们放入一个字符类,不要使用也匹配更多字符的通用\W

使用

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

请参阅regex demo

enter image description here

请注意,除了\之外的所有这些字符都不需要在字符类中转义。此外,添加+量词(匹配1个或更多个量化子模式)会简化替换过程(匹配整个连续的字符块,并用替换模式(此处为空字符串)一次性替换所有字符)

请注意,您可能还需要考虑conlpt1等文件名。