匹配句子括号中的任何单词

时间:2014-02-07 10:31:38

标签: c# regex

我正在尝试找到一个正则表达式来匹配句子中括号中的任何单词。

假设我有一句话。

"Welcome, (Hello, All of you) to the Stack Over flow."

说我的匹配词是Hello,Allof还是you。它应该返回true。 Word可以包含任何数字,符号,但通过空格分隔

我试过这个\(([^)]*)\)。但这会返回括号括起来的所有单词

static void Main(string[] args)
        {

            string ss = "Welcome, (Hello, All of you) to the Stack Over flow.";
            Regex _regex = new Regex(@"\(([^)]*)\)");
            Match match = _regex.Match(ss.ToLower());
            if (match.Success)
            {
                ss = match.Groups[0].Value;
            }

        }

非常感谢帮助和指导。

感谢。

感谢别人的时间和答案。我最终通过改变我的代码解决了Tim的回复。 对于有类似问题的人。我在这里写我的最终代码

static void Main(string[] args)
        {
            string ss = "Welcome, (Hello, All of you) to the Stack Over flow.";
            Regex _regex = new Regex(@"[^\s()]+(?=[^()]*\))");
            Match match = _regex.Match(ss.ToLower());
            while (match.Success)
            {
                ss = match.Groups[0].Value;
                Console.WriteLine(ss);
                match = match.NextMatch();
            }

        }

3 个答案:

答案 0 :(得分:1)

好的,所以看起来“单词”是不是空白而且不包含括号的任何内容,并且如果下面的下一个括号中的字符是右括号,则要匹配单词。

所以你可以使用

[^\s()]+(?=[^()]*\))

<强>说明:

  • [^\s()]+匹配“单词”(应该很容易理解)和
  • (?=[^()]*\))确保后面有一个右括号:

    (?=       # Look ahead to make sure the following regex matches here:
     [^()]*   # Any number of characters except parentheses
     \)       # followed by a closing parenthesis.
    )         # (End of lookahead assertion)
    

答案 1 :(得分:1)

如果您有兴趣,我已经为您开发了一个c#函数。

public static class WordsHelper
{
    public static List<string> GetWordsInsideParenthesis(string s)
    {
        List<int> StartIndices = new List<int>();
        var rtn = new List<string>();
        var numOfOpen = s.Where(m => m == '(').ToList().Count;
        var numOfClose = s.Where(m => m == ')').ToList().Count;
        if (numOfClose == numOfOpen)
        {
            for (int i = 0; i < numOfOpen; i++)
            {
                int ss = 0, sss = 0;
                if (StartIndices.Count == 0)
                {
                    ss = s.IndexOf('(') + 1; StartIndices.Add(ss);
                    sss = s.IndexOf(')');
                }
                else
                {
                    ss = s.IndexOf('(', StartIndices.Last()) + 1;
                    sss = s.IndexOf(')', ss);
                }
                var words = s.Substring(ss, sss - ss).Split(' ');
                foreach (string ssss in words)
                {
                    rtn.Add(ssss);
                }
            }
        }
        return rtn;
    }
}

只需这样称呼:

var text = "Welcome, (Hello, All of you) to the (Stack Over flow).";
            var words = WordsHelper.GetWordsInsideParenthesis(s);

现在,您将在words变量中找到单词列表。

一般来说,你应该选择c#编码,而不是正则表达式,因为在性能方面,c#更有效率和可读性,并且优于正则表达式。

但是,如果你想坚持使用正则表达式,那么没关系,请执行以下操作:

如果你想使用正则表达式,请保留Tim Pietzcker [^\s()]+(?=[^()]*\))的正则表达式,但是这样使用它:

var text="Welcome, (Hello, All of you) to the (Stack Over flow).";
var values= Regex.Matches(text,@"[^\s()]+(?=[^()]*\))");

现在values包含MatchCollection

您可以使用index和Value属性

访问该值

这样的事情:

string word=values[0].Value;

答案 2 :(得分:0)

(?<=[(])[^)]+(?=[)])

匹配括号中的所有单词

(?<=[(])检查(

[^)]+匹配所有内容但不包括)

(?=[)])检查)