2017-09-13 36 views
0

我想要一個正則表達式,它將與點.匹配的正則表達式在點之後的某個點有一個字母.或行結尾。正則表達式匹配後面有字母的點,在下一個點或行尾之前的點

例如,以下內容有效:.foo.bar

.foo.123將無效,因爲它包含.123它沒有字母后的字母。

到目前爲止我有:

^([a-z0-9)]|\.(?=.*[a-z].*\.))+$ 

據我所知,上述問題是在正向前查找一個.最後一場比賽:它總是不匹配。我想像「如果點存在匹配,否則匹配行尾」。如果我使用($|\.)代替最終匹配,這仍然不起作用,我假設它是因爲即使匹配.,它也會嘗試。

我想避免使用後視。我想匹配整個字符串,而不僅僅是點。

+0

你想提一下剛剛'.'或整行? –

+2

在'.foo.123'中,'.foo.'部分不應該匹配,因爲它有一個點,後面是「字母」,後面跟着另一個點?再舉一些例子/測試案例來澄清。 – Gurman

+1

你想匹配單個點或驗證完整的字符串是否匹配? – trincot

回答

1

這個正則表達式可能會有一些小的變化應該工作。 ^(?:\.[^\.\s]*[a-zA-Z][^\.\s]*)+$

Regex101 demo

擊穿的工作原理是:

  • ^ - 新線
  • (?:\.[^\.\s]*[a-zA-Z][^\.\s]*)的開始 - 抓鬥期,其後今後一個時期或新行之前的所有文本。確保至少有一封信。
    • \. - 從句點開始。
    • [^\.\s]* - 任何空間或.任何次數。
    • [a-zA-Z] - 確保每個週期至少有一個字母。
    • [^\.\s]* - 任何空間或.任何次數。
  • + - 一次或多次
  • $ - 電話那端
+0

這很好。你能澄清一下你的意思嗎?「既然這是一個重複的小組,那麼只要他們後面跟着字母,可能會有一段時間。」 – crossboy007

+0

似乎? mark實際上是一個早期正則表達式所需的複製錯誤。它應該只是匹配一段時間而非可選時段。這個錯誤打破了'Letters.foo'的情況。這就是爲什麼測試用例很重要! –

+1

已更新,刪除了'?'標記並有更清晰的描述。 –

相關問題