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_String_String Matching_Regex Negation - Fatal编程技术网

C# 如何使用正则表达式返回字符串以从要匹配的字符串中排除部分

C# 如何使用正则表达式返回字符串以从要匹配的字符串中排除部分,c#,regex,string,string-matching,regex-negation,C#,Regex,String,String Matching,Regex Negation,我正在尝试将字符串列表与正则表达式匹配,如下所示- regex.IsMatch(displayName) 但我的检查的第二步需要确保,如果displayName中的括号中包含任何文本,则不应返回匹配项 例如 如果regex正在查找包含“Muds”的字符串 所以如果我的第一个字符串是 “我的名字是Muds”--它应该返回一个匹配项(True) “我的名字是(包含的MUD)”——它应该返回否匹配(False) “我的名字是({Muds})”——它应该返回否匹配(False) 因此,从本质上讲,上述

我正在尝试将字符串列表与正则表达式匹配,如下所示-

regex.IsMatch(displayName)
但我的检查的第二步需要确保,如果
displayName
中的括号中包含任何文本,则不应返回匹配项

例如

如果
regex
正在查找包含“Muds”的字符串

所以如果我的第一个字符串是

“我的名字是Muds”--它应该返回一个匹配项(True)

“我的名字是包含的MUD”——它应该返回匹配(False)

“我的名字是{Muds}”——它应该返回匹配(False)

因此,从本质上讲,上述字符串被缩减为“我的名字是”
,括号内的内容被排除在外。 所以IsMatch语句被简化为-

regex.IsMatch("My name is")
我制作了一个正则表达式来查找括号内的内容

Regex excludingRegex = "\s?(?:\(.+\)|\[.+\]|<.+>|{.+})\s?"
Regex excludingrex=“\s?(?:\(.+\)\124\[.+\]\124;{.+})\s?”
让我们以
的形式调用上面的内容,不包括正则表达式

所以我想做一些类似的事情

regex.IsMatch(排除gregex.Replace(displayName,”)

简而言之,我想排除括号内与第一个正则表达式匹配的内容

我已经看到了很多关于消极前瞻和从regex中排除上下文的例子,但我无法将其正确地用于我的案例


任何指针都很好。

非常简单-使用前瞻:

^(?!.*\([^()]*\)).+

分解后,这表示:

^                # start of the string
(?!.*\([^()]*\)) # neg. lookahead making sure there's nothing between ( and )
.+               # match the line

请参阅。

嗨,这是我在控制台应用程序中创建的代码。在这里,我使用函数regex.split使用正则表达式拆分字符串(reg exp检查{}内的字符串的位置),并检查数组中的偶数项,我可以检查是否找到字符串mud并显示找到它的位置。赔率中的项目是在已检查字符串中的{}中找到的项目

你可以下载代码

static void Main(字符串[]args)
{
string input=“我的名字是({Muds})我的名字是Muds({Juan})我的名字是({Ortiz Mud})otra cosa por aca{Juan}pero pues aqui Mud{yani}”;
字符串模式=@“\{(.*?\}”;
string[]substring=Regex.Split(输入,模式);

对于(int i=0;i为什么不检查字符串是否包含
{
}
文本。包含(“{”)它没有那么简单,可能是我无法正确解释,但我们需要排除所有括号和内容within@Muds当输入为“我的{名字是…”时会发生什么?虽然逻辑上不可能,但用户可以创建任何东西,所以我会考虑不闭合括号作为一个拼写错误,并返回一个MATCH@Muds好的,我们越来越近了。你说的“我的(名字)是”?它是否也应该返回匹配?感谢您的尝试,但我正在寻找一个完全适用于regexThanks jan的答案,稍作调整后,我有了一个使其工作的想法。我只想问一件事,为什么您使用“[^()]”排除内部()有什么特别的原因吗?@Muds:没有特别的原因,但是你需要一个嵌套括号的递归方法。这就是我的想法,正则表达式中的递归,每天学习新的位。谢谢!
     static void Main(string[] args)
        {
 string input = "My name is ( { Muds } ) My name is MUDS ( { Juan } ) My name is ( { Ortiz Mud } ) otra cosa por aca {juan} pero pues aqui mud {yani}";
            string pattern = @"\{(.*?)\}"; 

            string[] substrings = Regex.Split(input, pattern);

            for(int i= 0; i <= substrings.Length; i ++)
            {
                if(i % 2 == 0)
                {
                    if (substrings[i].ToLower().Contains("mud"))
                    {
                        Console.Write(string.Format("This string has mud outside of brackets. Found in string: {0}", substrings[i].ToString()));
                        Console.Write("\n");
                    }
                }
            }



            Console.Read();

        }