如何构造正则表达式以匹配由空格分隔的固定字符串
本文关键字:分隔 字符串 空格 正则表达式 何构造 | 更新日期: 2023-09-27 18:36:27
我从来没有能够自己构造一个正则表达式,现在我有一个简单的应用程序需要一个。如何构造一个匹配的简单正则表达式:
- 固定字符串
- 无空格/任何空格
- "="字符
- 无空格/任何空格
- "("字符
目前,我正在使用以下代码来匹配整个单词,但正如您所看到的,它的功能非常有限。
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 或多个空格,直到满足下一个字符,+ 将匹配一个或多个空格,直到满足下一个字符。