使用正则表达式查找两个字符串的精确相等
本文关键字:字符串 两个 正则表达式 查找 | 更新日期: 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);
}