2013-01-17 20 views
3

我試圖做一個單一的模式,將驗證輸入字符串。驗證規則不允許任何字符連續重複3次以上。正則表達式:如何匹配沒有任何字符的字符串重複3次?

例如:

Aabcddee - 是有效的。

Aabcddde - 是不是有效,因爲3 d chracters。

目標是提供一個RegExp模式,可以匹配上述示例中的一個,但不能同時使用兩種。我知道我可以使用反向引用,如([a-z])\1{1,2},但這隻匹配順序字符。我的問題是,我無法弄清楚如何爲此製作單一模式。我想這一點,但我不太明白爲什麼它不工作:

^(([a-z])\1{1,2})+$

在這裏,我試圖以匹配內部組中重複1〜2次任意字符,然後我匹配內部組,如果它重複多次。但這不是那種方式。

謝謝。

+0

您使用哪種語言? –

+0

PCRE RegExp風味,在PHP中使用。 –

+0

我實際上不明白爲什麼'/ ^([a-z])\ 1 {1,2} $/i'匹配'aaa'。字符串的長度爲3個字符,比量化後的參考長。 –

回答

1

從你的問題我得到你想要匹配

  • 唯一字符串組成字符從[A-Za-z]
  • 只有它們沒有相同的字符序列與3個或更多
  • 長度字符串

那麼這個正則表達式應該工作:

^(?:([A-Za-z])(?:(?!\1)|\1(?!\1)))+$ 

Example in perl

+0

標記爲答案。因爲:它匹配'Aabcddee'並且不匹配'Aabcddde'。謝謝。 –

6

要檢查字符串沒有連續重複3次以上(任何一種,甚至是新線)的字符:

/^(?!.*(.)\1{2})/s 

您還可以檢查輸入字符串沒有與此正則表達式匹配。在這種情況下,你也可以知道連續重複3次或更多的字符。請注意,這與上面的完全相同,只是在負面預測(?!pattern)內的正則表達式被取出。

/^.*(.)\1{2}/s 

如果你想添加驗證該字符串只包含來自[a-z]字符,而您認爲aaA無效:

/^(?!.*(.)\1{2})[a-z]+$/i 

正如你可以看到i標誌(不區分大小寫)影響如何將捕獲的文本與當前輸入進行比較。

如果要允許空字符串通過,請將+更改爲*

如果你要考慮aaA是有效的,並且要允許大寫和小寫:

/^(?!.*(.)\1{2})[A-Za-z]+$/ 

第一眼看上去,它似乎是一樣的前一個,但由於沒有i標誌,所捕獲的文本不會受到不區分大小寫的匹配。

下面是失敗的答案,你可以忽略它,但你可以閱讀它的樂趣。


您可以使用此正則表達式來檢查字符串沒有3次重複字符(任何一種,甚至是新線)。

/^(?!.*(.)(?:.*\1){2})/s 

您還可以檢查輸入字符串是否與此正則表達式沒有任何匹配。在這種情況下,您也可以知道重複的字符大於或等於3次。請注意,這與上面的完全相同,只是在負面預測(?!pattern)內的正則表達式被取出。

/^.*(.)(?:.*\1){2}/s 

如果你想添加驗證該字符串只包含來自[a-z]字符,而您認爲aaA無效:

/^(?!.*(.)(?:.*\1){2})[a-z]+$/i 

正如你可以看到i標誌(不區分大小寫)影響如何將捕獲的文本與當前輸入進行比較。

如果你要考慮aaA是有效的,並且要允許大寫和小寫:

/^(?!.*(.)(?:.*\1){2})[A-Za-z]+$/ 

第一眼看上去,它似乎是一樣的前一個,但由於沒有i標誌,所捕獲的文本不會受到不區分大小寫的匹配。

+0

[ A-ZA-Z] + $ /'。然而,如果OP只想匹配正確的[[A-Za-z]序列(我不確定),那麼你的模式不匹配例如'ABAA!最多隻有來自'[A-Za-z]'的2個連續字符的aa'。 – speakr

+0

Upvoting。謝謝你提供的信息,非常有幫助。 –

+0

@speakr:從OP的問題來看,這個字符串似乎只能包含'[A-Za-z]',所以我假設'A!jashgd'被拒絕。 – nhahtdh

相關問題