Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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_C# 3.0 - Fatal编程技术网

c#正则表达式问题

c#正则表达式问题,c#,regex,c#-3.0,C#,Regex,C# 3.0,我试图过滤掉一些基于regex的文本,比如phone*意味着我想要文本“phone booth”、“phone cube”等等 但当我给booth时,它也会选择电话亭。它不应该选择它吗?这是密码 string[] names = { "phone booth", "hall way", "parking lot", "front door", "hotel lobby" }; string input = "booth.*, door.*"; string[]

我试图过滤掉一些基于regex的文本,比如phone*意味着我想要文本“phone booth”、“phone cube”等等

但当我给booth时,它也会选择电话亭。它不应该选择它吗?这是密码

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);
        }
string[]name={“电话亭”、“大厅通道”、“停车场”、“前门”、“酒店大厅”};
字符串输入=“展位。*,门。*”;
string[]patterns=input.Split(新字符[]{',});
列表过滤=新列表();
foreach(模式中的字符串模式)
{
Regex=null;
尝试
{
ex=新的正则表达式(pattern.Trim());
}
捕获{}
如果(ex==null)继续;
foreach(名称中的字符串名称)
{
if(ex.IsMatch(name)&&!filtered.Contains(name))filtered.Add(name);
}
}
foreach(筛选中的字符串filteredName)
{
MessageBox.Show(filteredName);
}
它显示“电话亭”和“前门”。但根据我的标准,它不应该显示任何东西,bcoz没有任何字符串是从展位或门开始的


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

如果要在字符串开头匹配,请以
^

例如,如果您希望匹配以phone开头,然后在其后包含字符,则可以执行以下操作

^phone.*

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

如果要在字符串的开头匹配,请使用
^

例如,如果您希望匹配以phone开头,然后在其后包含字符,则可以执行以下操作

^phone.*

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

问题在于您没有指定字符串必须以
booth
door
开头,只是字符串必须包含
booth
door
后跟长度为零或更大的字符串

但是,如果您将正则表达式更改为
^booth.*
^door.*
,则一切都应正常工作


插入符号(
^
)应该注意,它意味着“行/字符串的开头”(取决于正则表达式是否处于多行模式,即如果
将匹配换行字符)。

问题在于,您没有指定字符串必须以
booth
door
开头,简单地说,字符串必须包含
booth
door
,后跟长度为零或更大的字符串

但是,如果您将正则表达式更改为
^booth.*
^door.*
,则一切都应正常工作


插入符号(
^
)应该注意,它的意思是“行/字符串的开头”(取决于正则表达式是否处于多行模式——即如果
将匹配换行符)。

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

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

这将告诉C#你只想要以“booth”或“door”开头的内容。此处的更多信息:

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

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

这将告诉C#你只想要以“booth”或“door”开头的内容。此处的更多信息:

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

例如:

^booth.*
将匹配“电话亭”,但不匹配“电话亭”


将匹配任何包含“电话亭”的字符串。

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

例如:

^booth.*
将匹配“电话亭”,但不匹配“电话亭”


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

您的正则表达式没有指定模式中匹配字符串的位置受位置约束。如果要确保只匹配初始子字符串,则必须将“^”指定为模式的第一部分


有关详细信息,请参阅。

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


有关更多详细信息,请参阅。

Doh!谢谢你的提醒。啊!谢谢你的提醒。学究式的注释:
^
在谈到ascii字符时通常被称为插入符号。扬抑词用于表示变音符号(即在字母顶部粘贴字母时)。请注意,ˆ和^也是不同的符号。@Brian--注意并应用了学究式注释:-DPedantic Note:
^
在谈到ascii字符时通常称为插入符号。扬抑词用于表示变音符号(即在字母顶部粘贴字母时)。注意,ˆ和^也是不同的符号。@Brian——注意并应用了迂腐的注释:-D