【问题标题】:Within a string, how to check whether the previous character ahead of another one is a space?在一个字符串中,如何检查另一个字符前面的前一个字符是否是空格?
【发布时间】:2021-02-12 10:13:05
【问题描述】:

我面临着难以描述的情况。如果有错误会解释并纠正我

我确实有一个字符串

String 1 - I am: learning javascript ( no space before : )
String 2 - I am: learning javascript (1 space after : )

条件是首先我需要检查一个字符串是否只有1个冒号,如果字符串只有1个冒号,如果是,那么检查冒号前面的元素是什么,如果它确实有空间不做任何事情,如果它**没有空间**,请添加一个空格

我在字符串中发现了 1 个冒号

  term.indexOf(':') === term.lastIndexOf(':')) ||
 (term.match(new RegExp(":", "g")) || []).length===1) {

但是我没有得到冒号前面的字符是什么,如果它是 %20(空格),不要做任何事情,如果 NOT %20(我的意思不是空格)添加空格

如果发生任何混淆,我很抱歉,如果需要更多信息,我可以解释

提前致谢

【问题讨论】:

    标签: javascript regex string replace


    【解决方案1】:

    也许你可以使用:

    ^([^:]*(?<!\s)):([^:]*)$
    

    这将检查一个字符串是否只包含一个冒号,并且前面没有空格字符。不同的部分被分组捕获,因此您可以将其替换为: $1 :$2.

    在线查看demo

    • ^ - 开始字符串锚点。
    • ( - 打开第一个捕获组:
      • [^:]* - 0+ 次除冒号以外的任何字符。
      • (?&lt;!\s) - 一个消极的向后看,以防止前面的空格。
      • ) - 关闭第一个捕获组。
    • : - 匹配冒号。
    • ( - 打开第二个捕获组:
      • [^:]* - 0+ 次除冒号以外的任何字符。
      • ) - 关闭第二个捕获组。
    • $ - 结束字符串锚。

    const regex = /^([^:]*(?<!\s)):([^:]*)$/;
    
    [
      "I am: learning javascript",
      "I am : learning javascript"
    ].forEach(s => console.log(s.replace(regex, "$1 :$2")));

    【讨论】:

    • 我理解了演示,但是代码方面你能帮我如何使用相同的正则表达式返回相同的内容吗?
    • @Coder,JS 不是我的强项,但如果你按照我的链接了解,你可以使用代码生成器。它将是左侧面板上“工具”下的一个按钮。
    • 我完全理解,但是正在寻找正则表达式转换器代码,正则表达式将接受输入字符串并根据正则表达式转换为新字符串
    • (只是为了好玩,我发现一个只有一个组:-) regex101.com/r/ttZZsg/1
    • 很好@TheFourthBird。感谢您的编辑。我目前不在我的电脑上,但我也认为可以用简单的\S....替换负面的lookbehind 对吗?
    【解决方案2】:

    我会使用replace 方法和a regex which captures 可选的空格(也作为序列)和冒号...

    /(\s*)(:)/g

    replace的回调函数得到passed as its arguments ...

    1. 整个比赛...例如' :' 或只是 ':'
    2. 第一次捕获空白...例如' '''
    3. 第二次捕获冒号...原因总是':'

    因此,可以在回调函数中测试是否存在空格。

    function replaceWsColonGroup(match, space, colon) {
      console.log({ match, space, colon });
      return (space || " ") + colon;
    }
    const regXWsColonGroup = (/(\s*)(:)/g);
    
    console.log(
      ' I am: learning javascript =>\n',
      'I am: learning javascript'.replace(regXWsColonGroup, replaceWsColonGroup),
      '\n\n'
    );
    console.log(
      ' I am : learning javascript =>\n',
      'I am : learning javascript'.replace(regXWsColonGroup, replaceWsColonGroup),
      '\n\n'
    );
    console.log(
      ' I am\n\t: learning javascript =>\n',
      'I am\n\t: learning javascript'.replace(regXWsColonGroup, replaceWsColonGroup),
      '\n'
    );
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    关于 OP 的第一个条件,检查是否存在一个冒号,我建议使用基于 split 的方法,该方法在每个现有冒号处拆分字符串,然后只检查结果数组的 length 属性,该属性的值然后需要确切地说是2

    console.log(
      "... valid ...\n",
      "'I am: learning javascript'.split(':').length ...",
      'I am: learning javascript'.split(':').length  
    );
    console.log(
      "... invalid ...\n",
      "'I: am: learning javascript'.split(':').length ...",
      'I: am: learning javascript'.split(':').length  
    );
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    因此,一个消毒脚本看起来很像下面的...

    function sanitizeExpression(str) {
      return (String(str).split(':').length === 2)
        ? String(str)
            .replace((/(\s*)(:)/g), (_, $1, $2) => ($1 || ' ') + $2)
        : str
    }
    
    console.log(
      sanitizeExpression()
    );
    console.log(
      sanitizeExpression(null)
    );
    
    console.log(
      sanitizeExpression('foo bar baz')
    );
    console.log(
      sanitizeExpression('I:am:learning javascript')
    );
    
    console.log(
      sanitizeExpression('I am: learning javascript')
    );
    console.log(
      sanitizeExpression('I am\n\t: learning javascript')
    );
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    【讨论】:

      【解决方案3】:

      如果字符串只有1个冒号,如果是,则检查冒号前面的元素是什么,如果有空格则不做任何事情,如果没有空格,则添加空格

      Javascript 代码 -

      var term= "I am: learning javascript ";
      if(term.indexOf(':') === term.lastIndexOf(':')) {
      
            var indexOfColon = term.indexOf(':');
            var nextChar = term.charAt(indexOfColon + 2);
           
            if(nextChar != ' '){
                     
                     term = term.slice(0,indexOfColon+1) + ' ' + term.slice(indexOfColon+1)
             }
      }
      console.log(term) ==> "I am:  learning javascript ";
      

      在冒号后面加了一个空格

      【讨论】:

      • 如果没有空格,我应该在冒号前加一个空格
      猜你喜欢
      • 2011-12-16
      • 1970-01-01
      • 2013-05-12
      • 2019-05-11
      • 2010-10-13
      • 2022-03-31
      相关资源
      最近更新 更多