Regex 正则表达式与点匹配,但不在末尾

Regex 正则表达式与点匹配,但不在末尾,regex,Regex,我应该为文件名编写一个正则表达式,它允许字符 ^[a-zA-Z0-9 ()+,._&-]+$ 但它不能以一个点结束 我可以把这两种情况放在一起吗?您可以在开始时使用负面展望: ^(?!.*\.$)[a-zA-Z0-9 ()+,._&-]+$ ^^^^^^^ (?!.\.$)前瞻将在输入的开头被“触发”,一旦在字符串的末尾找到文字点,匹配就会失败 看 此外,您还可以使用另一个具有负lookback的版本(如果正则表达式引擎支持)。以下是基于后视的解决方案的一个糟糕示例,因为

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

^[a-zA-Z0-9 ()+,._&-]+$
但它不能以一个点结束


我可以把这两种情况放在一起吗?

您可以在开始时使用负面展望:

^(?!.*\.$)[a-zA-Z0-9 ()+,._&-]+$
  ^^^^^^^
(?!.\.$)
前瞻将在输入的开头被“触发”,一旦在字符串的末尾找到文字点,匹配就会失败

此外,您还可以使用另一个具有负lookback的版本(如果正则表达式引擎支持)。以下是基于后视的解决方案的一个糟糕示例,因为它将执行大量不必要的回溯:

^[a-zA-Z0-9 ()+,._&-]+(?<!\.)$
^[a-zA-Z0-9()+,.&-]+(?
这里有一个更好的方法,因为它有一个所有格量词,可以消除不必要的回溯,并且只在字符串末尾检查句点:

^[a-zA-Z0-9 ()+,._&-]++(?<!\.)$
                     ^^
^[a-zA-Z0-9()+,.&-]?
所有格量词的另一种选择是原子群:

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

^(?>[a-zA-Z0-9()+,.u&-]+)(?这个
^[a-zA-Z0-9()+,.u&-]+[^.]$
@Uchiha:环顾四周不使用文本,只需检查字符串中当前位置之前或之后是否有内容。否定字符类(如
[^.]
)确实使用文本。如果有至少2个字符的需求匹配,那么是的,可以使用该表达式。但是,它没有在开头锚定前瞻性的版本那么有效。感谢您的精彩解释。我个人非常喜欢您的答案和解释+1