c#正则表达式问题

时间:2010-08-30 14:28:42

标签: c# regex c#-3.0

我试图过滤掉一些基于正则表达式的文本,如手机*意味着我想要文本“电话亭”,“手机立方体”等。

但是当我给展位*时,它也选择了电话亭。它不应该选择它吗?这是代码,

string[] names = { "phone booth", "hall way", "parking lot", "front door", "hotel lobby" };

        string input = "booth.*, door.*";
        string[] patterns = input.Split(new char[] { ',' });
        List<string> filtered = new List<string>();

        foreach (string pattern in patterns)
        {
            Regex ex = null;
            try
            {
                ex = new Regex(pattern.Trim());
            }
            catch { }
            if (ex == null) continue;

            foreach (string name in names)
            {
                if (ex.IsMatch(name) && !filtered.Contains(name)) filtered.Add(name);
            }
        }

        foreach (string filteredName in filtered)
        {
            MessageBox.Show(filteredName);
        }

显示“电话亭”和“前门”。但按照我的标准,它不应该显示任何东西,bcoz没有字符串从展位或门开始。

我的正则表达式有问题吗?

5 个答案:

答案 0 :(得分:5)

如果您想在字符串开头与^

匹配

所以,例如,如果你想要一个以手机开头的比赛,那么在那之后包含人物,你可以做以下事情

^phone.*

^将匹配锚定到字符串的开头。

答案 1 :(得分:3)

问题是您没有指定字符串必须开始 boothdoor,只是字符串必须包含 { {1}}或booth后跟一个零长度或更长的字符串。

但是,如果您将正则表达式更改为door^booth.*,则所有都应

Caret(^door.*)应该注意,意思是“行/字符串的开头”(取决于你的正则表达式是否处于多行模式 - 即^是否匹配换行符。)

答案 2 :(得分:1)

是的,您应该在模式前加上“^”,如下所示:

string input = "^booth.*, ^door.*";

这将告诉C#你只想要以“booth”或“door”开头的内容。更多信息:http://oreilly.com/windows/archive/csharp-regular-expressions.html

答案 3 :(得分:1)

如果您不希望“电话亭”匹配,您需要在正则表达式中指定字符串的开头。

示例:

^booth.*

将匹配“展位”,但不匹配“电话亭”。

booth.*

将匹配任何包含“booth”的字符串。

答案 4 :(得分:0)

您的Regex未指定模式中匹配字符串的位置是位置约束的。如果要确保只匹配初始子字符串,则必须指定“^”作为模式的第一部分。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/az24scfc.aspx