Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用正则表达式求两个字符串的精确等式_C#_Regex - Fatal编程技术网

C# 用正则表达式求两个字符串的精确等式

C# 用正则表达式求两个字符串的精确等式,c#,regex,C#,Regex,在我的C应用程序中,我需要搜索字符串以确定它们是否是度量单位的缩写。例如,我需要找到mm,表示毫米,l表示升,m2表示平方米,kg表示千克,等等。 仅当字符串与模式完全相等时才需要匹配,但当模式包含在较大的字符串中时则不需要匹配。例如,如果字符串等于mm,则我需要匹配,但当字符串为(例如)长度为55 mm时,则不需要匹配 我知道最简单的方法是使用一系列if-else-if语句和==运算符,但可能的问题是,我事先不知道用户将搜索的所有单元的名称,而且,他们可以使用不同的单元集。例如,一次可以是长度

在我的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;
    }
但它不能像我想的那样工作。我得到了一个匹配的毫米,但我也得到了一个匹配的长度是55毫米

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

我以前已经使用过正则表达式,但是在比这个简单得多的情况下,所以,目前我还没有完全理解


提前感谢您的帮助。

您忘记了括号

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

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

您忘记了括号

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

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

我不会为此使用正则表达式。如果元素不多,我会使用哈希集,甚至只是一个简单的数组:

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 string[] Units = { "m2", "m3", "kg", "mm", "cm", 
                                   "m", "t", "h", "l" };

private static bool IsUnit(string text)
{
    return Units.Contains(text);
}
或:

不过,就文化敏感性而言,你需要弄清楚自己到底想要什么样的案例不敏感


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

您只需要知道它是否是某种单元吗

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

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

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

你应该将文本转换成小写,使其与表达式一样不区分大小写。你怎么能这么快就做到呢?@SamIam,他先写一行答案,然后在5分钟的范围内填充-@Qtax关于toLower,单位区分大小写。毫米是1000000米,毫米是.001米meters@SamIam,我并不是说这是正确的方式,这正是OP想要的。你应该将文本转换为小写,使其与表达式一样不区分大小写。你怎么能这么快做到?SamIam,他首先写了一行答案,然后在5分钟的范围内填充-@Qtax关于toLower,单位区分大小写。毫米是1000000米,毫米是.001米meters@SamIam,我并不是说这是正确的方法,这正是OP看起来想要的。使用^and$实际上并不是匹配字符串的开头和结尾,而是匹配行的开头和结尾。为此,您需要\A和\Z。很可能您没有搜索多行字符串,但值得注意的是,使用“^”和“$”实际上并不是匹配字符串的开头和结尾,而是匹配行的开头和结尾。为此,您需要\A和\Z。很可能您没有搜索多行字符串,但值得注意的是。不,在这种情况下,我需要知道输入字符串是否正好等于集合中的一个单位。这是处理带有技术数据的Excel表格的大型项目的一部分。不,在这种情况下,我需要知道输入字符串是否正好等于集合中的一个单位。这是处理带有技术数据的Excel表格的大型项目的一部分。