C#正则表达式模式获取单词

3
我正在尝试找出从字符串中获取单词的模式。例如,假设我的字符串是:
string text = "HI/how.are.3.a.d.you.&/{}today 2z3";

我试图排除任何一个字母或数字以下的内容,但它没有起作用。
Regex.Split(s, @"\b\w{1,1}\b");

我也尝试了这个:
Regex.Splits(text, @"\W+"); 

但输出结果是:

“HI how are a d you today”

我只想得到所有的单词,使得我的最终字符串是:

“HI how are you today”


1
通过解决这个问题,你不会得到所有单词的列表,只有所有两个或更多字母的单词。你将排除像“a”、“I”等单个字母的单词。这是有意的吗? - Gibron
同意Gibron的观点。单个字母也是有效的单词。 - Ilia G
1个回答

4
为了获得至少有2个字符的所有单词,您可以使用此模式:\b[a-zA-Z]{2,}\b
string text = "HI/how.are.3.a.d.you.&/{}today 2z3";
var matches = Regex.Matches(text, @"\b[a-zA-Z]{2,}\b");
string result = String.Join(" ", matches.Cast<Match>().Select(m => m.Value));
Console.WriteLine(result);

正如其他评论中指出的那样,“A”和“I”都是有效的单词。如果你决定匹配这些单词,可以使用以下模式:
var matches = Regex.Matches(text, @"\b(?:[a-z]{2,}|[ai])\b",
                            RegexOptions.IgnoreCase);

在这两个模式中,我使用了\b来匹配单词边界。如果您的输入是"1abc2",那么"abc"将不会被匹配。如果您想要匹配它,则需要删除\b元字符。从第一个模式中这样做很简单。第二个模式将改为[a-z]{2,}|[ai]

你实际上需要在那里使用\b吗? - Ilia G
@liho1eye,根据给定的输入,我不需要它们,所以也许可以省略它们。如果 OP 有一些如 "1abc2" 的输入,则当前的模式将忽略 "abc" 单词。如果这不是期望的结果,则可以删除 \b 元字符以匹配它。 - Ahmad Mageed
我想关于"word"一词,目前存在一些困惑。对我来说,"1abc2"是一个有效的单词,尽管可能不适用于原帖作者。 - Ilia G
一方面,OP 使用了“\w”,包括数字,但在最终输出中,OP 排除了“2z3”,这应该是一个单词。考虑到这一点,我认为“1abc2”不符合条件。 - Ahmad Mageed

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