C# C正则表达式搜索并替换由空格包围的所有整数

C# C正则表达式搜索并替换由空格包围的所有整数,c#,regex,C#,Regex,如果这是一个重复的问题,我道歉。我还没有找到解决我的问题的办法 我想搜索所有被空格包围的整数,并用空格替换它们 StringBuilder sb = new StringBuilder(" 123 123 456 789 fdsa jkl xyz x5x 456 456 123 123"); StringBuilder sbDigits = new StringBuilder(Regex.Replace(sb.ToString()), @"\s[0-9]+\s", " ", RegexOptio

如果这是一个重复的问题,我道歉。我还没有找到解决我的问题的办法

我想搜索所有被空格包围的整数,并用空格替换它们

StringBuilder sb = new StringBuilder(" 123 123 456 789 fdsa jkl xyz x5x 456 456 123 123");
StringBuilder sbDigits = new StringBuilder(Regex.Replace(sb.ToString()), @"\s[0-9]+\s", " ", RegexOptions.Compiled);
sbDigits返回值为123 789 fdsa jkl xyz x5x 456 123

我希望返回值是fdsa jkl xyz x5x


那么,到底发生了什么?如何确保获得重复的号码?

请尝试以下正则表达式:

String fixed = Regex.Replace(originalString, "\\s*\\d+\\s+", "");
StringBuilder sb = new StringBuilder(" 123 123 456 789 fdsa jkl xyz x5x 456 456 123 123");
StringBuilder sbDigits = new StringBuilder(Regex.Replace(sb.ToString(), @"\s*[0-9]+\d\s*", " ", RegexOptions.Compiled));
您可以使用以下选项:

search:  @"( [0-9]+)(?=\1\b)"
replace: ""
这个怎么样:

测试字符串:

 123 123 456 789 fdsa jkl xyz x5x 456 456 123 123 5x
正则表达式:

(?<=\s|^)[\d]+(?=\s|$)
如果添加分词符\b,则只能捕获您想要的“数字词”。您可以在数字周围捕获零个或多个空格,而不匹配字母中的数字:

\s*\b\d+\b\s*

我对正则表达式了解不多。但这可以通过一点LINQ来实现:

发生了什么 看看应用正则表达式时会发生什么,正则表达式匹配一个空格、任意数字和另一个空格:

"( 123 )123 456 789 fdsa jkl xyz x5x 456 456 123 123"
// regex engine matches " 123 ", first fitting pattern
"( 123 )123( 456 )789 fdsa jkl xyz x5x 456 456 123 123"
// regex engine matches " 456 ", because the first match "ate" the whitespace
"( 123 )123( 456 )789 fdsa jkl xyz x5x( 456 )456 123 123"
// matches the first " 456 "
"( 123 )123( 456 )789 fdsa jkl xyz x5x( 456 )456( 123 )123"
// matches " 123 "
"( 123 )123( 456 )789 fdsa jkl xyz x5x( 456 )456( 123 )123"
所以正则表达式只找到了123456456和123。您将这些匹配项替换为空白,这就是导致输出的原因

你想做什么 你想把单词边界和一些不会侵蚀单词边界的东西匹配起来,比如空格。正如许多其他人所建议的那样

\b\d+\b

这就行了。

那么,重复字符串是什么意思?听起来你们只是想摆脱数字。我敢肯定这段代码甚至都不会编译。你们真有趣。我感谢你的评论。。。这段代码来自一个示例控制台程序,我必须让这段代码为一个更大的项目工作。它可以编译,除非我漏掉了分号。我所说的复制字符串是指任何并发的复制,比如jkl、jkl或123。两个起始字符串中的任何一个都不会接受下一个含义,jkl jkl将是jkl,123 123将是123。@迈克:你说过要搜索所有被空格包围的整数,并用空格替换它们。你的问题不是由重复引起的,你应该从你的标题中编辑这一部分,这样人们就可以很容易地找到你的问题。谢谢@Robin,我会修改。是否需要双“\”字?另外,这不会得到最后一个,因为它后面没有空格。我相信在不使用@literal符号时,双“\\”是必要的。这一个替换了所有数字。我希望只替换数字字:123可以5x5,x5x,5x,x5不可以ok@kmatyaszek:[0-9]+\d与\d{2,}相同\d+在这里就足够了,这也不行。我想替换整个数字单词,而不是所有数字。@迈克:这很好,如果你不能做一个简单的测试,不要发布问题。[]是多余的:\d是[0-9]的快捷方式,在这里就足够了。由于使用了lookahead/lookahead,这不会捕获/替换数字周围的空格。取决于其他人的需要。我不知道你可以“或”^/$,很有趣!这个也行。除了你给出这个答案,我不记得还有其他人。如果我在@MElliott之前看到这个,我会接受的。你的问题有点不清楚,因为复制的东西让一些人感到困惑。尽量让标题更清楚,然后在你认为最适合问题的答案上做记号,如果有必要,你可以取消勾选,以便将来参考。这是对的。我很抱歉,如果其他人解释,搜索所有被空格包围的整数,以表示除9999以外的任何内容。
var str = "123 789 fdsa jkl xyz x5x 456 123";
var parts = str.Split().Where(x => !x.All(char.IsDigit));
var result = string.Join(" ", parts); //  fdsa jkl xyz x5x
"( 123 )123 456 789 fdsa jkl xyz x5x 456 456 123 123"
// regex engine matches " 123 ", first fitting pattern
"( 123 )123( 456 )789 fdsa jkl xyz x5x 456 456 123 123"
// regex engine matches " 456 ", because the first match "ate" the whitespace
"( 123 )123( 456 )789 fdsa jkl xyz x5x( 456 )456 123 123"
// matches the first " 456 "
"( 123 )123( 456 )789 fdsa jkl xyz x5x( 456 )456( 123 )123"
// matches " 123 "
"( 123 )123( 456 )789 fdsa jkl xyz x5x( 456 )456( 123 )123"
\b\d+\b