正则表达式查找两个空格之间的单词或多个单词

3

我想要找到句子中两个空格之间的单词,即在搜索单词之前和之后的第一个空格之前的单词。

如果我的搜索单词是example,则This is anexampleof what I want应返回anexampleof

我现在有这个正则表达式"(?:^|\S*\s*)\S*" + searchword + "\S*(?:$|\s*\S*)",但它给我返回了额外的一些单词在开头和结尾。 'This is anexampleof what I want' --> 返回 'is anexampleof what'

我试图更改正则表达式,但我并不擅长它... 我正在使用C#。感谢您的帮助。

C#完整代码:

MatchCollection m1 = Regex.Matches(content, @"(?:^|\S*\s*)\S*" + searchword + @"\S*(?:$|\s*\S*)",
                              RegexOptions.IgnoreCase | RegexOptions.Multiline);

好的,如果你的内容是这样的,你期望得到什么呢?This is an exampleof what I want 或者 This is anexample of what I want 或者 This is an example of what I want。你能展示一下在每个例子中你期望得到的输出吗?如果你能说出来,我需要包含我的关键词的单词,那就简单了。如果关键词不在两个单词之间,你期望得到什么呢?:) 如果我理解有误,请纠正我。 - bonCodigo
1
如果您担心用户传递特殊的正则表达式字符,请使用+ Regex.Escape(searchword) +替换+ searchword + - Rawling
1个回答

3
您可以简单地省略末尾的非捕获组:
@"\S*" + searchword + @"\S*";

由于贪心算法,您将在每个侧面获得尽可能多的非空格字符。
另外,非捕获组的想法并不是它们不包含在匹配中。它们所做的只是不生成子匹配的捕获。如果您想要检查是否有某些内容,但不想将其包含在匹配中,则需要使用环视
@"(?<=^|\S*\s*)\S*" + searchword + @"\S*(?=$|\s*\S*)"

然而,在这种情况下,这些环视实际上并没有起到任何作用,因为\s*\S*可以满足空字符串(因为*使两个字符都是可选的)。但是,仅供参考...如果您想在匹配边界处进行断言,并且这些断言不应是匹配的一部分...那么环视是正确的方法。

看起来它也这样做。现在我进一步测试了自己,发现这个也可以工作,但我认为你的解决方案更简单:MatchCollection m1 = Regex.Matches(content, @"(?:^|\S\s)" + searchword + @"(?:$|\s\S)", RegexOptions.IgnoreCase | RegexOptions.Multiline); 谢谢! - PitAttack76
@Stieven76 如果您的输入是 This is an example of what I want,则您的最后一个模式将返回 an example of - Martin Ender

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接