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

时间:2018-01-24 16:37:48

标签: c# regex string string-matching regex-negation

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

regex.IsMatch(displayName)

但我的检查的第二步需要确保如果displayName中的括号中包含任何文字,则不应返回匹配。

对于前。

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

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

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

“我的名字是 Muds包含” - 它应该返回 NO 匹配(False)。

“我的名字是 { Muds } ” - 它应该返回 NO 匹配(错误)。

基本上,上面的字符串被缩减为“我的名字是”,括号内的内容被排除在外。 所以IsMatch语句然后简化为 -

regex.IsMatch("My name is")

我制作了一个正则表达式,用于查找括号内的内容

Regex excludingRegex = "\s?(?:\(.+\)|\[.+\]|<.+>|{.+})\s?"

允许我们调用excluding regex

所以我想做一些像

这样的事情

regex.IsMatch(的 ExcludingRegex.Replace(显示名 “”)

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

我已经看过很多关于否定前瞻的例子,并且从正则表达式中汲取了上下文,但我无法为我的案例做好准备。

任何指针都会很棒。

2 个答案:

答案 0 :(得分:2)

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

您可以下载代码here

     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();

        }

答案 1 :(得分:1)

这很简单 - 使用前瞻:

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

<小时/> 细分,这说:

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

请参阅a demo on regex101.com