正则表达式匹配点但不是最后

时间:2015-10-27 09:20:15

标签: regex

我应该为文件名写一个正则表达式,它允许使用字符

^[a-zA-Z0-9 ()+,._&-]+$

但它无法用点完成。

我可以将两者放在一起吗?

1 个答案:

答案 0 :(得分:3)

您可以在开头使用否定前瞻:

^(?!.*\.$)[a-zA-Z0-9 ()+,._&-]+$
  ^^^^^^^

(?!.*\.$)前瞻将被触发"在输入的开头,一旦在字符串的末尾找到一个文字点,就会使匹配失败。

请参阅regex demo

此外,您可以使用另一个带有负向外观的版本(如果正则表达式引擎支持它)。这是基于后视的解决方案的一个不好的例子,因为它将执行许多不必要的回溯:

^[a-zA-Z0-9 ()+,._&-]+(?<!\.)$

这是一个更好的一个,因为它有一个占有量词,可以消除不必要的回溯,并只检查字符串末尾的句号:

^[a-zA-Z0-9 ()+,._&-]++(?<!\.)$
                     ^^

占有量词的另一种选择是原子群:

^(?>[a-zA-Z0-9 ()+,._&-]+)(?<!\.)$
 ^^^                     ^