c# - 如何使用正则表达式删除特定单词之间的空格?
问题描述
我想从字符串中的特定单词中删除空格。例如,将以下查询视为输入字符串
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");
那么是否可以创建一个正则表达式来仅从字符串中的特定单词中删除空格?
任何建议表示赞赏。
解决方案
我会使用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())
和任何其他组合。
推荐阅读
- html - 在一个容器中设置表单方法和子元素的样式
- java - 使用 volley 将数据插入 MySQL
- c++ - 验证 Rcpp::Function 对象?
- c# - 我想使用 C# 代码恢复 SQL Server 数据库
- powershell - Powershell 添加 reg 密钥
- python - 从 SQL 语法到 SQLAlchemy 语法
- c# - 直接引用 Razor 类库程序集
- c# - C# - 在另一个方法中实现抽象或接口方法
- docker - Dockerfile 错误:standard_init_linux.go:207:exec 用户进程导致“没有这样的文件或目录
- ruby-on-rails - 找不到 redis_cache_store 的缓存存储适配器(无法加载此类文件 -- active_support/cache/redis_cache_store)