使用正则表达式检查单词中的一个或多个空格

Posted

技术标签:

【中文标题】使用正则表达式检查单词中的一个或多个空格【英文标题】:Check for one or more space in a word using regex 【发布时间】:2021-09-28 18:39:25 【问题描述】:

我的场景:

我正在尝试在句子中的单个单词(PK_myid)中查找空格。例如:

"ID is PK_myid some more words"

请注意,“一些更多的词”是固定的,并且永远是一样的。

到目前为止,我能够写这部分:

(?Id\s+is\s+(\w+\s+\w+\s+)+some) 

这只是检查单词之间的一个空格,我可以有多个空格,如下所示

"PK_ my id"

【问题讨论】:

投反对票的人应该注意"能够写这部分到目前为止(?Id\s+is\s+(\w+\s+\w+\s+)+some) " 【参考方案1】:

你可以使用

\bID\s+is\s+(\w+(?:\s+\w+)*?)\s+some\b

请参阅regex demo。 详情

\bID - 整个词 ID \s+is\s+ - is 用一个或多个空格括起来的单词 (\w+(?:\s+\w+)*?) - 第 1 组:一个或多个单词字符,然后出现零个或多个(但尽可能少)一个或多个空格和单词字符 \s+ - 一个或多个空格 some\b - 一个完整的词some

在 C# 中,要获得第一次出现,您可以使用

var output = Regex.Match(text, @"\bID\s+is\s+(\w+(?:\s+\w+)*?)\s+some\b")?.Groups[1].Value;

获取所有匹配项:

var output = Regex.Matches(text, @"\bID\s+is\s+(\w+(?:\s+\w+)*?)\s+some\b")
    .Cast<Match>()
    .Select(x => x.Groups[1].Value);

见C# demo online:

var line = "ID is PK_myid some more words\nID is PK_ my id some more words";
var pattern = @"\bID\s+is\s+(\w+(?:\s+\w+)*?)\s+some\b";
var output = Regex.Matches(line, pattern)
        .Cast<Match>()
        .Select(x => x.Groups[1].Value);
foreach (var s in output)
    Console.WriteLine(s);

输出:

PK_myid
PK_ my id

【讨论】:

如果没有空格,它仍然匹配(PK_myid)的问题。 @KeshavTaurah 如果必须有空格,将*?替换为+?\bID\s+is\s+(\w+(?:\s+\w+)+?)\s+some\b

以上是关于使用正则表达式检查单词中的一个或多个空格的主要内容,如果未能解决你的问题,请参考以下文章

如何使正则表达式在每个单词之间强制使用逗号?

正则表达式检查字符串是不是只有空格

正则表达式只允许单词之间有一个空格

如何构建一个正则表达式来捕获由单个空格分隔的单词?

pyspark 中的正则表达式来检查字母和空格(也可以使用 uni 代码)

正则表达式