我试图过滤掉一些基于正则表达式的文本,如手机*意味着我想要文本“电话亭”,“手机立方体”等。
但是当我给展位*时,它也选择了电话亭。它不应该选择它吗?这是代码,
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没有字符串从展位或门开始。
我的正则表达式有问题吗?
答案 0 :(得分:5)
如果您想在字符串开头与^
所以,例如,如果你想要一个以手机开头的比赛,那么在那之后包含人物,你可以做以下事情
^phone.*
^将匹配锚定到字符串的开头。
答案 1 :(得分:3)
问题是您没有指定字符串必须开始 booth
或door
,只是字符串必须包含 { {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。