代码之家  ›  专栏  ›  技术社区  ›  Greg Wozniak

regex-替换除单个字母后的空格之外的所有空格

  •  1
  • Greg Wozniak  · 技术社区  · 7 年前

    在javascript中,我想用百分比(%)替换所有与以下正则表达式不匹配的空格:

    \b[a-zA-Z]\s\b

    我试图排除一个字符旁边的所有空格,并替换所有其他字符。万一:

    的确,商学院对孩子很好,而商学院却不是

    除a-b、b-c和c-s之间的空间外,所有空间均应替换为百分比。结果是:

    是的%a b c school%对于%kids%是%great%,而%c d e school%不是%not

    我读到:

    1. Regex negative match query
    2. Replace part of string that doesn't match regex

    但这并没有给我最终的答案。

    目前 query.replace(\b[a-zA-Z]\s\b,'%') 完全替换应该保留的空间。

    你能告诉我怎样用正确的方式否定我的表达吗?

    5 回复  |  直到 7 年前
        1
  •  1
  •   Wiktor Stribiżew    7 年前

    匹配并捕获您拥有的模式,只需匹配其他上下文中的任何其他空白:

    var s = "True that A B C School is great for kids and C D E School is not";
    var rx = /\b([a-zA-Z]\s)\b|\s/g;
    console.log(
      s.replace(rx, function($0,$1) { return $1 ? $1 : "%"; })
      // ES6+ syntax
      // s.replace(rx, ($0,$1) => $1 ? $1 : "%" )
    );
    // => True%that%A B C School%is%great%for%kids%and%C D E School%is%not

    细节

    • \b([a-zA-Z]\s)\b -一个单词边界,然后是任何ascii字母和一个空格(捕获到组1中),后跟一个单词边界
    • | -或
    • \s -1个空白字符

    在匿名方法(或箭头方法)中, $0 代表整场比赛 $1 表示捕获的文本(组1值)。如果组1匹配,我们只返回它的值(因此,保留1个字母单词后面的空白)。否则,匹配的空白将替换为 % .

        2
  •  0
  •   Leethium    7 年前

    不需要否定任何表达式,只需匹配“两个或多个字符后跟空格”

    替换

    ([a-zA-Z]{2,})\s
    

    通过

    $1
    
        3
  •  0
  •   KooiInc    7 年前

    尝试

    console.log("[foo bar foobar   barfoo b f f b ]".replace(/([a-z]{2,})(\s+)/gi, "$1#"));
        4
  •  0
  •   Semi-Friends    7 年前

    看看这个。希望有帮助。它所做的是首先在空格前找到至少需要2个字母的匹配项,然后用一个管道“”替换它。换成你想要的。你可以使用这个作为你的基础,如果你有更多的条件可以从这里扩展。

    var myString = 'A B C School is great for kids';
        
    var result = myString.replace(/\w{2}\s/gi, match => match.replace(' ', '|'))
    
    document.writeln(result)
        5
  •  0
  •   MT0    7 年前

    你也可以匹配:

    • 非文字界限 \B 后跟非空白字符 \S 或;或
    • 字符串的开头 ^

    后跟一个或多个空白字符 \s+ 使用正则表达式:

    /(\B\S|^)\s+/g
    

    例如:

    var regex = /(\B\S|^)\s+/g;
    
    var tests = [
      " ",
      " A B C Test DE",
      "True that A B C School is great for kids and C D E School is not"
    ];
    
    for ( var i = 0; i < tests.length; i++ )
    {
      console.log( `"${tests[i]}" -> "${tests[i].replace( regex, '$1%' )}"` );
    }