用于验证文件名的Javascript正则表达式

Raf*_*yan 13 javascript regex

我有一个regexp来验证文件名.就这个:

/[0-9a-zA-Z\^\&\'\@\{\}\[\]\,\$\=\!\-\#\(\)\.\%\+\~\_ ]+$/
Run Code Online (Sandbox Code Playgroud)

它应该允许这样的文件名:

aaa
aaa.ext
a#
A9#.ext
Run Code Online (Sandbox Code Playgroud)

不允许使用以下字符 \ / : * ? \" < > |

问题是文件名喜欢*.txt/\kk通过验证.我正在使用keyup事件进行验证.因此,当我在不允许的情况下放置一个额外字符后,它会显示一切正确.

And*_* D. 32

对于Windows名称.

var isValid=(function(){
  var rg1=/^[^\\/:\*\?"<>\|]+$/; // forbidden characters \ / : * ? " < > |
  var rg2=/^\./; // cannot start with dot (.)
  var rg3=/^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i; // forbidden file names
  return function isValid(fname){
    return rg1.test(fname)&&!rg2.test(fname)&&!rg3.test(fname);
  }
})();

isValid('file name');
Run Code Online (Sandbox Code Playgroud)

  • 在 rg1 中使用 \ 转义 /。至少,VS 2010 是这么认为的。 (2认同)
  • 缺少AUX,COM0实际上有效,以“.”开头。实际上是有效的... [ref](https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file) (2认同)

Qta*_*tax 8

您需要使用^和锚定表达式$.例如:

/^[-\w^&'@{}[\],$=!#().%+~ ]+$/
Run Code Online (Sandbox Code Playgroud)

请注意,您需要-在字符类中转义,或者将其放在第一个/最后一个.


Mat*_*ens 8

您需要添加一个起始锚点:

/^[0-9a-zA-Z ... ]+$/
Run Code Online (Sandbox Code Playgroud)

这告诉引擎从输入的开始一直到输入的结尾匹配,而对于原始表达式,它只需要在输入的末尾匹配.


Rya*_*ams 5

/^(?!\.)(?!com[0-9]$)(?!con$)(?!lpt[0-9]$)(?!nul$)(?!prn$)[^\|\*\?\\:<>/$"]*[^\.\|\*\?\\:<>/$"]+$/

Must not be empty.
Must not start with .
Must not be com0-com9, con, lpt0-lpt9, nul, prn
Must not contain | * ? \ : < > $
Must not end with .
Run Code Online (Sandbox Code Playgroud)