使用正则表达式查找两个字符串的完全相等

时间:2013-03-14 15:49:23

标签: c# regex

在我的C#应用​​程序中,我需要搜索字符串以查找它们是否是度量单位的缩写。例如,我需要找到毫米的“mm”,升的“l”,平方米的“m2”,公斤的“kg”等等。 只有当字符串完全等于模式时才需要匹配,但是当模式包含在更大的字符串中时,我不需要匹配。例如,如果字符串等于“mm”,我想要一个匹配,但是当字符串是“长度为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;
    }

但它不能按我的意愿工作。我得到一个“mm”的匹配,但我也得到了“长度为55毫米”的匹配

我认为,如果我同时使用“^”和“$”锚点,它将被解释为“匹配,如果在开头找到模式 AND 和字符串的结尾”,只有在完全相同的情况下才是真的。但不,似乎它被解释为“匹配,如果在开头找到模式 OR 和字符串的结尾”。

我之前已经使用过正则表达式,但是在比这个更简单的情况下,所以,目前我被卡住了。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分: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

对于简单的字符串相等,正则表达式比它们值得IMO更麻烦。

当然,可以在封闭类的每个实例的基础上指定单位,或者其他 - 我只是静态地对它们进行硬编码,因为你的问题也是硬编码的。

编辑:为了使这种情况不敏感,最简单的方法可能是使用HashSet版本并使用适当的StringComparer构建它,例如:

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

(就文化敏感度而言,你需要确定完全你想要什么样的不区分大小写。)

鉴于单位名称​​不是通常不区分大小写,我建议不要这样做。

答案 1 :(得分:1)

你忘了括号!

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

?:是可选的,只是意味着不捕获该组匹配的值。

答案 2 :(得分:0)

你只需要知道它是否是某种单位?

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