2013-03-14 33 views
1

在我的C#應用​​程序中,我需要搜索字符串以查找它們是否是度量單位的縮寫。例如,我需要找到「毫米」,毫米,「升」升,「平方米」平方米,「千克」千克等。 只有當字符串與模式完全相同時,我才需要匹配,但是當模式包含在較大的字符串中時不需要匹配。例如,如果字符串等於「毫米」,我想要匹配,但不是當字符串是「長度爲55毫米」時。使用正則表達式查找兩個字符串的確切等價性

我知道最簡單的方法是使用一系列if-else if語句和==操作符,但問題可能是我不能預先知道用戶將搜索的所有單元的名稱因爲他們也可以和不同的單位合作。例如,有一次它可能是長度和體積單位(mm,m,cm,m3,l),而在另一些情況下,它可能是電氣單位(A,V,W,MW,kWh)。

所以,我的想法是在項目中添加一個簡短的XML文件,該應用程序將在運行時讀取實際的單位並撰寫用於搜索字符串的正則表達式。 作爲第一次嘗試,我用這個方法:

private bool IsUnit(String theString) 
    { 
     Regex regExUnits = new Regex("^(?i)m2|m3|kg|mm|cm|[mthl]$"); 
     Match m = regExUnits.Match(theString); 
     return m.Success; 
    } 

但是這麼想的工作,因爲我想要的。我得到一個「毫米」的匹配,但我也得到一個匹配的「長度是55毫米」

我認爲,如果我同時使用「^」和「$」錨,它將被解釋爲「匹配如果在起始處找到該模式並且字符串「結尾」,只有在確切相等的情況下才是真的。但是,不,似乎它被解釋爲「匹配,如果模式在的開頭和字符串的末尾找到」。

我已經使用過正則表達式,但在比這個更簡單的情況下,所以,暫時我被卡住了。

非常感謝您的幫助。

+0

使用^和$您實際上並不匹配「字符串的開始和結尾」,但是匹配LINE的開頭和結尾。 您需要\ A和\ Z。你可能不會搜索多行字符串,但值得注意的是這一點。 – 2013-03-14 15:58:08

回答

1

你忘了括號!

"^(?i)(?:m2|m3|kg|mm|cm|[mthl])$" 

?:是可選的,只是表示不捕獲該組匹配的值。

4

我不會爲此使用正則表達式。我會使用一個HashSet<string> - 甚至只是一個簡單的數組,如果沒有很多的元素:

static readonly string[] Units = { "m2", "m3", "kg", "mm", "cm", 
            "m", "t", "h", "l" }; 

private static bool IsUnit(string text) 
{ 
    return Units.Contains(text); 
} 

或者:

static readonly HashSet<string> Units = new HashSet<string> { 
    "m2", "m3", "kg", "mm", "cm", "m", "t", "h", "l" }; 

// IsUnit method as before 

對於簡單的字符串相等,正則表達式是比他們更麻煩值得海事組織。

當然,單位可以在封閉類的每個實例的基礎上指定,或者任何 - 我只在這裏靜態硬編碼它們,因爲你的問題讓它們硬編碼了。

編輯:爲了使這種情況下不敏感,最簡單的方法可能是使用HashSet版本,並使用適當的StringComparer(例如,:

static readonly HashSet<string> Units = 
    new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ... }; 

(你需要制定出正是你想要什麼樣的不區分大小寫的,雖然,在文化敏感性的條款。)

由於單位名稱一般不區分大小寫,但我建議不要這樣做。

+0

您應該將'text'轉換爲小寫,以使其不區分大小寫(如表達式所示)。 – Qtax 2013-03-14 15:55:38

+0

你怎麼這麼快? – 2013-03-14 15:55:39

+0

@SamIam,他首先寫了一個1行的答案,然後在5分鐘的範圍內填寫。 ;-)關於'toLower'的@Qtax – Qtax 2013-03-14 15:56:44

0

你只需要知道它是否是某種單位?

public static void Main() 
{ 
    string input = Console.ReadLine(); 
    string[] sarr = { "kg", "li", "mm" }; 
    bool isUnit = sarr.Contains(input); 
} 
+0

不,在這種情況下,我需要知道輸入字符串是否完全等於集合中的一個單位。這是使用技術數據處理Excel工作表的較大項目的一部分。 – Akart 2013-03-15 14:35:51

相關問題