1

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

我知道最简单的方法是使用一系列 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 mm”的匹配

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

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

预先感谢您的任何帮助。

4

3 回答 3

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) { ... };

(但是,就文化敏感性而言,您需要确切地确定您想要什么样的不区分大小写。)

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

于 2013-03-14T15:52:42.527 回答
1

你忘了括号!

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

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

于 2013-03-14T15:51:48.553 回答
0

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

public static void Main()
{
    string input = Console.ReadLine();
    string[] sarr = { "kg", "li", "mm" };
    bool isUnit = sarr.Contains(input);
}
于 2013-03-14T15:55:16.107 回答