【问题标题】:Regex - replace all spaces except a space after a single letter正则表达式 - 替换单个字母后除空格外的所有空格
【发布时间】:2018-06-11 09:07:25
【问题描述】:

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

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

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

的确,A B C 学校对孩子们很好,而 C D E 学校则不然

除 A-B 和 B-C 和 C-S 之间的空格外,所有空格都应替换为百分比。所以结果是:

True%that%A B C School%is%great%for%kids%and%C D E School%is%not

我读到了:

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

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

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

您能建议如何以正确的方式否定我的表达吗?

【问题讨论】:

  • 修改得更具体

标签: javascript regex


【解决方案1】:

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

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】:

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

    替换

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

    $1
    

    【讨论】:

    • 那么,您认为 OP 不想替换数字后的空格吗?还是在字符串的开头/结尾等处?
    • 这可以工作,但它是 86 步和 10 场比赛,而我的 \b 似乎要快一些。但是,如果没有其他问题出现,可能会被使用,因为我认为它也可以完成这项工作。
    【解决方案3】:

    试试

    console.log("[foo bar foobar   barfoo b f f b ]".replace(/([a-z]{2,})(\s+)/gi, "$1#"));

    【讨论】:

    • 不匹配字符串开头或非字母字符后的空格。
    【解决方案4】:

    看看这个。希望能帮助到你。它的作用是首先找到在空格前至少需要 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)

    【讨论】:

    • 不匹配字符串开头或非单词字符后的空格。 IE。 Insert Names' School is great for kids。另外,为什么要使用带有另一个替换而不是捕获组的函数并在替换字符串中使用$1
    • you can use this as your base and expand from here if you have more conditions to add - 字符串开头的空格?不应该通过修剪来完成吗?根据其他字符。好吧,如果您查看用户提供的内容,您就会知道我为什么使用\w
    • 顺便说一句。请使用你的这个想法举一个例子`一个捕获组并在替换字符串中使用 $1`。向你学习会很棒:)
    • myString.replace(/(\w{2})\s/gi, '$1|') 是我用捕获组来简化代码的意思。但是,它仍然没有解决我在答案中提出的任何其他问题。
    • 哇...我不知道。感谢分享。将再次阅读文档
    【解决方案5】:

    你可以匹配:

    • 非单词边界\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%' )}"` );
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2011-08-28
      相关资源
      最近更新 更多