我想要提及@ usernames。用戶名有以下規則:(。)如何解決這個@mention正則表達式?
- 只有小寫字母,數字或點
- 沒有啓動或以一個點
- 不超過連續一個點結束(如user..name不允許的,但us.er.name是)
所以,我本想出了:
/(?:^|\s)(@)(?!\.)(?!.*\.\.)(?!.*\.[\s|$])([a-z0-9\.]+)(?:\s|$)/gm;
應該意味着:
(?:^|\s) starting at start of line, or with a whitespace
(@) having a @
(?!\.) name not starting with a dot
(?!.*\.\.) not containing two adjacent dots (..)
(?!.*\.[\s|$]) not ending with a dot (yes this sucks)
([a-z0-9\.]+) allowed chars
(?:\s|$) ending at EOL or whitespace
作爲一個正則表達式的完整noob,我很高興看到這是如何執行一個長的多行測試字符串。 但後來我想最簡單的測試字符串,如:
@foo @bar I hate you both.
在這種情況下,富時抓住了,但酒吧不是。我想,即使我使用非捕獲組,@foo
也需要以下空格,所以@bar
失敗,在(?:^|\s)
。
我應該如何修改這個正則表達式來有它的工作?
請不要建議完全不同的@mention正則表達式,我可以很好地尋找他們,因爲有其他問題。我只想讓這個工作,並知道爲什麼不這樣做。
你想要發生什麼「@ foo @ bar」? –
@Shawn根本就沒有抓到,兩者之間必須有空白。 – natario
如果您使用Lookbehind([示例](https://regex101.com/r/ypzKoJ/1)),那麼您的RegEx完美工作,但是我確定您知道Javascript不支持該功能。最好的辦法是嘗試將lookbehind轉換成lookahead和條件語句。 –