2015-02-10 68 views
0

有沒有人知道怎麼說我可以得到全名的前3個字母的正則表達式(C#)搜索?C#正則表達式:搜索每個名稱的前3個字母

不使用的(.*

我用(.**),但它滾動文本遠遠超出了請求的名稱,或者 如果它發現的第一個條件和後100個字找不到第二個條件,他返回文字不是外觀,所以我必須限制單詞的數量。 例如:\s*(?:\s+\S+){0,2}\s*

我想忽略名稱少於3個字符的名稱。

搜索包含前3個字符開始任何名義:

'Mar Jac Rey' (regex that performs search) 

應符合:

  • CK 江淮 OBS LS 雷伊 nolds
  • Mar cus Jac obine 雷伊小號
  • OON 江淮 queline通過雷伊 ILS

誰能幫助我?

+0

您的輸入/輸出和正則表達式很混亂,請編輯並重新編寫問題。 – hwnd 2015-02-10 21:37:32

+0

我正在使用C#語言 – 2015-02-10 21:44:17

+0

更改了文字以便更好地理解 – 2015-02-10 21:49:22

回答

0

零個或多個量詞(*)默認爲'貪婪'—也就是說,它會消耗盡可能多的字符以找到模式的其餘部分。這就是爲什麼Mar.*Jac將與第一個Mar匹配的輸入和最後的Jac以及其間的所有內容。

一個可能的解決方案是讓您的模式「不貪心」(*?)。這將使其消耗盡可能少的字符以匹配模式的其餘部分。

Mar.*?Jac.*?Rey 

然而,這並不是一個很好的解決方案,因爲它仍然匹配的各種名稱的部分,無論什麼其他文本—例如之間出現Marcus Jacobine Should Not Match Reys將是有效的匹配項。

要允許只有空白或最多2個連續的非空白字符的名稱部分之間出現,你就必須獲得更多的花哨:

\bMar\w*(\s+\S{0,2})*\s+Jac\w*(\s+\S{0,2})*\s+Rey\w* 

模式(\s+\S{0,2})*\s+將匹配任何數量的非包含至多兩個字符的空白字符,每個字符都被空白包圍。每個名稱部分後面的\w*確保整個名稱包含在匹配的那部分中(您可能想在此處使用\S*,但這並不完全清楚您的問題)。並且我在開始處投擲了一個字邊界(\b),以確保匹配不會在「單詞」中間開始(例如OMar不匹配)。

0

我想你想要的是這個正則表達式來檢查它是否是真實的,不區分大小寫

@"^[Mar|Jac|Rey]{3}" 

那麼具體:

@"^[\w]{3}" 
+0

我不能使用正則表達式「OR」(Mar | Jac | Rey),因爲每個名稱的3個字母都是強制性的,應該是(三個)。 – 2015-02-10 22:22:56

+0

建議的'\ w'怎麼樣? – Drifter 2015-02-10 22:29:57

0

如果你想捕捉的前三個字母每個字至少有三個字符可以使用類似的字樣:

((?<name>[\w]{3})\w+)+ 

並啓用ExplicitCapture時初始化您的正則表達式。

它會返回一串匹配名爲「名稱」,他們每一個都是結果。

代碼示例:

Regex regex = new Regex(@"((?<name>[\w]{3})\w+)+", RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase); 
var match = regex.Matches("Marck Jacobs L. S. Reynolds"); 

如果你想也可拍攝3分字符的話,您可以用空格替換最後一個「\ W」。在這種情況下,請考慮處理該短語的最後一個詞。

相關問題