如何构造正则表达式以匹配由空格分隔的固定字符串

本文关键字:分隔 字符串 空格 正则表达式 何构造 | 更新日期: 2023-09-27 18:36:27

我从来没有能够自己构造一个正则表达式,现在我有一个简单的应用程序需要一个。如何构造一个匹配的简单正则表达式:

  1. 固定字符串
  2. 无空格/任何空格
  3. "="字符
  4. 无空格/任何空格
  5. "("字符

目前,我正在使用以下代码来匹配整个单词,但正如您所看到的,它的功能非常有限。

Regex.Matches(data, @"'b" + Regex.Escape(columnID + "=(") + @"'b");
Regex.Matches(data, @"'b" + Regex.Escape(columnID + "= (") + @"'b");
Regex.Matches(data, @"'b" + Regex.Escape(columnID + " =(") + @"'b");
Regex.Matches(data, @"'b" + Regex.Escape(columnID + " = (") + @"'b");

如何构造正则表达式以匹配由空格分隔的固定字符串

则表达式中的"any"表示*量词("Kleene star"),其确切意思是"以前的标记,任意经常"。

请注意,要使其正常工作,您显然只能转义固定单词,而不能转义其余单词

Regex.Matches(data, @"'b" + Regex.Escape(columnID) + @" *= *'('b");

另请注意,我们现在必须手动转义末尾的左括号。

而且,正如汉斯在评论中正确指出的那样,使用's而不是空格是很常见的; "fixedString's*='s*'("代表"空格",包括常规空格、制表符和换行符。

下面是满足您要求的正则表达式。 使用固定字符串作为前缀。

Regex.Matches(data, Regex.Escape(columnID) + @"'s*='s*'(");

在正则表达式中,"*"匹配前一个表达式的"0 或多个",而 "+" 匹配一个或多个。 "[]"将与括号内的任何字符匹配。 此外,您可以使用"[^]"来匹配"不是这些字符"。

对于您的示例,以下正则表达式模式应该有效(将"fixedString"替换为您的固定字符串): "('b[a-zA-Z]+'b)'s*='s*'("

为了了解有关正则表达式的更多信息,如果您的字段是任意字符串,则可以使用以下字段: "('b[a-zA-Z0-9]+'b)"

分解一下:

"'s*"将匹配一个单词边界,至少一个字母数字字符,然后匹配一个单词边界(所以基本上是一个只由字母数字字符组成的单词)。

"="将匹配"无空格/任何空格"

"'s*"将匹配等号

"'("见上文

'w将匹配"("字符(这必须转义,因为"("表示正则表达式中复杂表达式的开头。

如果您想练习创建正则表达式模式,我建议您使用 http://www.regextester.com/。

更新:我不小心在原始帖子中为空格添加了'w's表示单词字符(字母数字字符加"_")。 它已被替换为正确的正则表达式转义字符CC_14。

您说的是"任何空格",但根据您的正则表达式所说的内容,您似乎正在寻找一个可选的单个空格。如果是这种情况,请使用问号。

Regex.Matches(data, Regex.Escape(columnID) + @"'s?='s?'(");

正则表达式中的问号表示前一个字符(如果使用括号,则为组)是可选的。

如果要查找可能存在也可能不存在的单个空格,请不要使用 + 或 *,因为 * 将匹配 0 或多个空格,直到满足下一个字符,+ 将匹配一个或多个空格,直到满足下一个字符。