2015-10-27 70 views
1

我應該寫一個文件名正則表達式,它使字符正則表達式匹配的斑點而不是在最後

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

但不能以點結束。

我可以把兩者放在一起嗎?

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

輸入開頭的(?!.*\.$)先行將「觸發」,將失敗的比賽,一旦字面點是:

回答

3

你可以在開始時使用負前瞻發現在字符串的末尾。

regex demo

此外,您還可以使用其他版本的負回顧後(如果正則表達式引擎支持的話)。這是因爲它會進行很多不必要的回溯的向後看基礎的解決方案的一個壞榜樣:

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

這是一個更好的,因爲它有一個佔有慾量詞,這將消除不必要的回溯和將檢查期間僅在字符串的末尾:

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

到所有格量詞的替代方案是的原子團:

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

這個怎麼樣'^ [A-ZA-Z0-9()+ ,. _& - ] + [^]'$ –

+1

@Uchiha:瀏覽周圍不會消耗文本,只需檢查字符串中當前位置之前或之後是否有東西。否定的字符類(如'[^。]')會消耗文本。如果要求*匹配至少2個字符*,那麼可以使用表達式。儘管如此,它並沒有像預測版的開頭那樣有效。 –

+1

感謝那真棒的解釋。我真的很喜歡你的回答和解釋+1 –

相關問題