Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用正则表达式删除特定单词之间的空格?_C#_Regex - Fatal编程技术网

C# 如何使用正则表达式删除特定单词之间的空格?

C# 如何使用正则表达式删除特定单词之间的空格?,c#,regex,C#,Regex,我想删除字符串中特定单词的空格。例如,将下面的查询视为输入字符串 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 )
现在我想删除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");
那么,是否可以创建一个正则表达式,只从字符串中的特定单词中删除空格


非常感谢您的任何建议。

我将使用lookback和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)
SELECT LTRIM(RTRIM([EMPOYEE_NAME])), LTRIM(RTRIM([EMPOYEE_ADDR])), LTRIM(RTRIM([EMPOYEE_TYPE])) FROM EMPLOYEE WHERE ( EMPLOYEE_ID = @EMPLOYEE_ID )
SELECT LTRIM(RTRIM([EMPOYEE_NAME])), LTRIM(RTRIM([EMPOYEE_ADDR])), LTRIM(RTRIM([EMPOYEE_TYPE])) FROM EMPLOYEE WHERE ( EMPLOYEE_ID = @EMPLOYEE_ID )
编辑2

另一种解决方案是从零件中删除,然后替换支架附近的空间,然后添加缺少的零件

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);
这也将匹配LTRIM RTRIM LTRIMRRIM RTRIMLTRIM和任何其他组合


测试和解释:

使用替换的MatchEvaluator功能来处理实际的脏活

使用\s[LR]TRIM\s的基本模式,我们将用空格标识目标TRIM单词。在该模式中,我们将创建一个子组,该子组将通过L或R标识需要提供的内容,该子组位于.group[1].value。因此,该组将告诉我们是放入{SP}LTRIM还是无空间RTRIM

返回

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

一般情况下,您需要一个解析器,因为LTRIM可以作为字符串、注释等的一部分出现。从dual-LTRIM中选择“my LTRIM”作为LTRIM-这里我们有字符串、引号和注释,它们应该完整地保留以添加到上面,老实说,这应该由您的IDE处理,它可能具有代码清理功能。我确信IntelliJ和Eclipse中存在这种情况,但对Visual Studio不太确定。如果应该删除空白的子字符串可以与@\bLTRIM\s*\\s*RTRIM\s*\[^]*\\s*\\匹配,那么这个问题可以用一个正则表达式解决。谢谢,@ALFA-但除了LTRIM RTRIM之外,它不会删除任何其他字符串中的空格。如果LTRIM和RTRIM的顺序发生变化,是否可能?由于它的动态字符串和输入字符串可以是任何组合,如LTRIMRTRIMcolumn name或LTRIM或RTRIM或RTRIMLTRIMcolumn name现在检查我的答案,我为您的请求添加了一个替代解决方案。您应该为它添加替代项,它现在太复杂了,无法同时匹配空大括号和RTRIMLTRIM。同时,我会尝试找出一个更好的方法。检查我的编辑2,看看它是否适合你的需要。
string txt = "SELECT LTRIM ( RTRIM ( [EMPOYEE_NAME] ) ), LTRIM ( RTRIM ( [EMPOYEE_ADDR] ) ), LTRIM ( RTRIM ( [EMPOYEE_TYPE] ) ) FROM EMPLOYEE WHERE ( EMPLOYEE_ID = @EMPLOYEE_ID  )";

Regex.Replace(txt, @"\s([LR])TRIM\s", new MatchEvaluator( mtch => {

return (mtch.Groups[1].Value == "L") ? $" LTRIM" : "RTRIM";

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