首页 > 解决方案 > 如何使用正则表达式删除特定单词之间的空格?

问题描述

我想从字符串中的特定单词中删除空格。例如,将以下查询视为输入字符串

SELECT LTRIM ( RTRIM ( [EMPOYEE_NAME] ) ), LTRIM ( RTRIM ( [EMPOYEE_ADDR] ) ), LTRIM ( RTRIM ( [EMPOYEE_TYPE] ) ) FROM EMPLOYEE WHERE ( EMPLOYEE_ID = @EMPLOYEE_ID )

现在我想删除 LTRIM、RTRIM 大括号和其中的内容之间的空格,而不是从整个字符串中删除。

所以最终的输出应该是

SELECT LTRIM(RTRIM([EMPOYEE_NAME])), LTRIM(RTRIM([EMPOYEE_ADDR])), LTRIM(RTRIM([EMPOYEE_TYPE])) FROM EMPLOYEE WHERE ( EMPLOYEE_ID = @EMPLOYEE_ID )

我尝试了以下解决方案,但它替换了所有空格 -

var source = "SELECT LTRIM ( RTRIM ( [EMPOYEE_NAME] ) ), LTRIM ( RTRIM
( [EMPOYEE_ADDR] ) ), LTRIM ( RTRIM ( [EMPOYEE_TYPE] ) ) FROM EMPLOYEE
WHERE ( EMPLOYEE_ID = @EMPLOYEE_ID )";

source = Regex.Replace(source, "\\s(\\s?)\\s*", "$1");

那么是否可以创建一个正则表达式来仅从字符串中的特定单词中删除空格?

任何建议表示赞赏。

标签: c#regex

解决方案


我会使用lookbehind和lookahead:

var source = "SELECT LTRIM ( RTRIM ( [EMPOYEE_NAME] ) ), LTRIM ( RTRIM ( [EMPOYEE_ADDR] ) ), LTRIM ( RTRIM ( [EMPOYEE_TYPE] ) ) FROM EMPLOYEE WHERE ( EMPLOYEE_ID = @EMPLOYEE_ID )";
source = Regex.Replace(source, @"((?<=LTRIM)(\s)|(?<=RTRIM)\s+(?=\()|(?<=\()\s+|\s+(?=\)))", "");
Console.WriteLine(source);

输出:

SELECT LTRIM(RTRIM([EMPOYEE_NAME])), LTRIM(RTRIM([EMPOYEE_ADDR])), LTRIM(RTRIM([EMPOYEE_TYPE])) FROM EMPLOYEE WHERE (EMPLOYEE_ID = @EMPLOYEE_ID)

测试及说明:https ://regex101.com/r/agq0V5/1

注意:为了简化它,它还会删除WHERE大括号内的空格,有那么糟糕吗?

编辑

WHERE这里的解决方案链接组,大括号内没有匹配的空格。

var source = "SELECT LTRIM ( RTRIM ( [EMPOYEE_NAME] ) ), LTRIM ( RTRIM ( [EMPOYEE_ADDR] ) ), LTRIM ( RTRIM ( [EMPOYEE_TYPE] ) ) FROM EMPLOYEE WHERE ( EMPLOYEE_ID = @EMPLOYEE_ID )";
source = Regex.Replace(source, @"(LTRIM)(\s*)(\()(\s*)(RTRIM)(\s*)(\()(\s*)([^ ]*)(\s*)(\))(\s*)(\))", "$1$3$5$7$9$11$13");
Console.WriteLine(source);

输出:

SELECT LTRIM(RTRIM([EMPOYEE_NAME])), LTRIM(RTRIM([EMPOYEE_ADDR])), LTRIM(RTRIM([EMPOYEE_TYPE])) FROM EMPLOYEE WHERE ( EMPLOYEE_ID = @EMPLOYEE_ID )

编辑 2

另一种解决方案是删除该FROM部分,然后替换大括号附近的空格,然后添加缺少的部分。

var source = "SELECT LTRIM ( RTRIM ( [EMPOYEE_NAME] ) ), LTRIM ( RTRIM ( [EMPOYEE_ADDR] ) ), LTRIM ( RTRIM ( [EMPOYEE_TYPE] ) ) FROM EMPLOYEE WHERE ( EMPLOYEE_ID = @EMPLOYEE_ID )";
var from_part = Regex.Match(source,  @"FROM.*");
var partial_source = Regex.Replace(source, @"FROM.*", "");

source = Regex.Replace(partial_source, @"(\s+(?=\))|(\s+(?=\())|(?<=\()(\s+))", "");

var final_string = source + from_part.Value;
Console.WriteLine(final_string);

输出:

SELECT LTRIM(RTRIM([EMPOYEE_NAME])), LTRIM(RTRIM([EMPOYEE_ADDR])), LTRIM(RTRIM([EMPOYEE_TYPE])) FROM EMPLOYEE WHERE ( EMPLOYEE_ID = @EMPLOYEE_ID )

这也将匹配LTRIM() RTRIM() LTRIM(RTRIM()) RTRIM(LTRIM())和任何其他组合。

测试及说明:https ://regex101.com/r/28nfTE/1


推荐阅读