我正在尝试找到一个正则表达式来匹配句子中括号中的任何单词。
假设我有一句话。
"Welcome, (Hello, All of you) to the Stack Over flow."
说我的匹配词是Hello,
,All
,of
还是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();
}
}
答案 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)
(?<=[(])[^)]+(?=[)])
匹配括号中的所有单词
(?<=[(])
检查(
[^)]+
匹配所有内容但不包括)
(?=[)])
检查)