2013-03-14 29 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

相关问题