我应该为文件名写一个正则表达式,它允许使用字符
^[a-zA-Z0-9 ()+,._&-]+$
但它无法用点完成。
我可以将两者放在一起吗?答案 0 :(得分:3)
您可以在开头使用否定前瞻:
^(?!.*\.$)[a-zA-Z0-9 ()+,._&-]+$
^^^^^^^
(?!.*\.$)
前瞻将被触发"在输入的开头,一旦在字符串的末尾找到一个文字点,就会使匹配失败。
请参阅regex demo
此外,您可以使用另一个带有负向外观的版本(如果正则表达式引擎支持它)。这是基于后视的解决方案的一个不好的例子,因为它将执行许多不必要的回溯:
^[a-zA-Z0-9 ()+,._&-]+(?<!\.)$
这是一个更好的一个,因为它有一个占有量词,可以消除不必要的回溯,并只检查字符串末尾的句号:
^[a-zA-Z0-9 ()+,._&-]++(?<!\.)$
^^
占有量词的另一种选择是原子群:
^(?>[a-zA-Z0-9 ()+,._&-]+)(?<!\.)$
^^^ ^