正则表达式用2个或更多替换2个或更多

时间:2019-01-29 18:43:43

标签: regex

我想用一个以上的&nbps;代替一个以上的空间,但是如果只用1个,我想将其保留为正常空间。

测试用例:

input     | desired output
---------------------------
a test    | a test
a  test   | a  test
a   test  | a   test

在这种情况下,我也想保留换行符,以后将用
替换掉,所以我只使用作为正则表达式尝试

到目前为止,我所得到的只是将/ {2,}/g替换为 ,但是我不知道如何使替换匹配模式中{}找到的计数。有没有办法做到这一点,或者通过一些迭代过程来做会更好?

在这种情况下,我使用的是C#:Regex.Replace(input, @" {2,}", " ")

3 个答案:

答案 0 :(得分:1)

您可以使用基于环顾的正则表达式:

(?<= ) | (?= )

并用&nbsp;

替换

RegEx Demo

C#代码:

Regex.Replace(input, @"(?<= ) | (?= )", "&nbsp;")

RegEx详细信息:

  • (?<= ) :匹配前面有另一个空格的一个空格
  • |:或
  • (?= ):匹配一个空格,然后是另一个空格

答案 1 :(得分:1)

由于要替换伴随更多空间的每个空间,因此可以使用环顾四周定位每个这样的空间,并用&nbsp;替换。这是正则表达式,

 (?= )|(?<= ) 

此正则表达式将不匹配单个空格,而仅匹配一个空格后跟一个空格或一个空格的后缀。

Demo

C# Demo

演示的内联代码,以防万一一段时间后链接因某种原因消失

    string pattern = @" (?= )|(?<= ) ";
    string substitution = @"&nbsp;";
    string input = @"a test
a  test
a   test";
    RegexOptions options = RegexOptions.Multiline;

    Regex regex = new Regex(pattern, options);
    string result = regex.Replace(input, substitution);
    Console.WriteLine(result);

打印

a test
a&nbsp;&nbsp;test
a&nbsp;&nbsp;&nbsp;test

答案 2 :(得分:1)

这可能是技术上最有效的方法:

\B | \B

演示:https://regex101.com/r/QnHQoz/1

说明:

  • 在某些情况下,\b匹配单词边界,基本上是单词字符(字母和数字)和非单词字符之间的任何点。
  • \B\b的否定词,表示它与\b不匹配的所有内容匹配,反之亦然。
  • 因此,上面的模式匹配A.)相同类型的两个字符之间的点,后跟一个空格,或B.)一个空格后跟相同类型的两个字符之间的点。