2013-04-30 91 views
6

我試圖創建正則表達式來查找包含最多三個不同字符的所有輸入。輸入多長時間無關緊要。箱子如何使用正則表達式檢查不同字符的數量?

實施例:

  • 「32 32 32 32 34」 - >匹配
  • 「MM」 - >匹配
  • 「」 - >匹配
  • 「1234」 - >不匹配

我所做的正則表達式來找出四個或更多不同的字符輸入,但現在我需要它在相反的方向...

(.).*(?\1)(.).*(?\1)(?\2)(.).*(?\1)(?\2)(?\3)(.) 

主要問題是:如何檢查不同字符的數量?

+6

在我看來這是一個非常令人費解的問題,正則表達式來解決。這是一個要求嗎?爲什麼不以更傳統的方式解決它? – pcalcao 2013-04-30 10:04:49

+1

從你的第一個例子來判斷,空白不計入3個字符? – 2013-04-30 10:16:29

+2

這是使用正則正則表達式無法實現的,因爲您需要某種類型的堆棧或計數或狀態,這是常規語言不能使用的。實際上,您可能可以解決一些問題,因爲大多數正則表達式解析器都沒有定義常規語言,但最好使用不同的方法。 – Oliver 2013-04-30 10:18:40

回答

3

下面將字符串匹配最多三個不同的非空格字符

^\s*(\S)?(?:\s|\1)*(\S)?(?:\s|\1|\2)*(\S)?(?:\s|\1|\2|\3)*$ 

(\S)匹配一個非空格字符,並捕獲它,所以它然後可以在後面的正則表達式使用反引用參考例如\1(\S)?中的?被使用,所以字符串可以包含零個,一個,兩個或三個非空格字符。

?:使組不捕獲。

正則表達式的第一部分捕獲多達三個不同的非空格字符\1\2\3,然後(?:\s|\1|\2|\3)*確保只有那些字符或空間\s然後可以在串$結束之前出現。

的一種方式,在Javascript中,計算不同的非空字符串中的字符數「使用正則表達式」:

var str = 'ABC ABC'; 
var chars = ''; 

str.replace(/\S/g, function (m) { 
    if (chars.indexOf(m) == -1) chars += m; 
}); 

chars.length; // 3 
+1

爲什麼你在開始和結束時都有斜槓? (提示:斜線與正則表達式沒有任何關係,它們是應用程序的語言製品) – Bohemian 2013-04-30 11:25:33

+2

@Bohemian這是一個常見的約定,比如將字符串放在括號內的引號或URL中。不需要迂腐。沒有混淆。 – 2013-04-30 13:33:02

+1

@RaymondChen我不同意。這不常見,也不正確。 *一些*語言使用斜槓,但是例如我最熟悉的兩種語言(以及非常流行的語言) - Java和SQL - 不使用斜槓。新手用戶可能不知道有關斜線和混淆。本網站力求正確。事實是,給出的答案是錯誤的,即使已經建立了斜槓使用語言(它沒有),從技術上講,它仍然是不正確的,因爲斜槓不是所需的*正則表達式的一部分* ,這個問題是關於正則表達式的。 – Bohemian 2013-04-30 14:18:50

0

良好的Q值。下面是我能想出的最簡單的:

^\s*([^\s]{1,3}\s+)*[^\s]{0,3}$ 

說明:

  1. ^\s*空白的任何量在開始比賽。
  2. ([^\s]{1,3}\s+)*匹配1到3之間的重複組 非空白字符後跟至少一個空白字符。 考慮將?:放在(之後,以使其成爲非捕獲組。
  3. 最後的[^\s]{0,3}允許字符串以最多三個非空白字符結尾(所以它不必以2所強制的空格結束。)

可視化:

Regular expression visualization

演示:

測試在這裏:Debuggex Demo

相關問題