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

本文关键字:字符串 两个 正则表达式 查找 | 更新日期: 2023-09-27 18:03:50

在我的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"的匹配,但我也得到了"长度是55mm"的匹配

我认为,如果我同时使用"^"answers"$"锚,它将被解释为"如果模式在的开头和字符串的末尾找到匹配",这只有在完全相等的情况下才成立。但是没有,它似乎被解释为"如果模式在开头和字符串的末尾找到匹配"。

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

提前感谢您的帮助

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

我不会使用正则表达式。我将使用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) { ... };

(您需要准确地计算出您想要哪种类型的大小写不敏感,但是在文化敏感性方面。)

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

你忘记加括号了!

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

?:是可选的,只是表示不捕获与该组匹配的值。

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

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