首页 文章

查找非指定字符的索引

提问于
浏览
0

比方说,我有一个字符串

thisIsThisTuesday Day

我想找到所有大写字母的索引,测试前面是否有空格,如果没有插入一个 . 我需要每个的索引 . 至少从我所看到的 indexOf(String) 只会产生第一次出现的字符索引 T/t

这个 :

for(i=0;i<str.length;i++){
  let char=str[i];

  if(isNaN(char*1)&&char==char.toUpperCase()){
    y=str.indexOf(char);
    console.log(char,y)
  }
}

会产生大写字母及其索引,但只会显示相关字符的第一个匹配项 . 我非常有信心我缺少的部分是一个for()循环,以便移动索引迭代..但它逃脱了我 .

先感谢您!

5 回答

  • 0

    你可以使用正则表达式:

    它匹配任何非空格字符后跟一个大写字母,并用两个字符替换它们之间的空格 .

    const str = "thisIsThisTuesday Day";
    const newstr = str.replace(/([^ ])([A-Z])/g, "$1 $2");
    console.log(newstr);
    
  • 1

    实际上, String.indexOf 函数可以采用第二个参数,指定它应该开始搜索的字符 . 看看:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf

    但是,如果您只想查找所有大写字母并在其前面添加空格字符,如果找不到,则有很多方法,例如:

    var str = "thisIsThisTuesday Day";
    var ret = '';
    for (var i=0; i<str.length; i++) {
        if (str.substr(i, 1) == str.substr(i, 1).toUpperCase()) {
            if ((i > 0) && (str.substr(i - 1,1) != " "))
                ret += " ";
        }
        ret += str.substr(i,1);
    }
    

    运行此操作后,ret将保持值“this is This Tuesday Day”

  • 0

    您可以迭代字符串并检查每个字符是否为大写字母 . 像这样的东西:

    const s = 'thisIsThisTuesday Day';
    
    const format = (s) => {
        
        let string = '';
    
        for (let c of s) {
    
            if (c.match(/[A-Z]/)) string += ' ';
    
            string += c;
        }
    
        return string;
    };
    
    console.log(format(s));
    

    或者使用reduce功能:

    const s = 'thisIsThisTuesday Day';
    
    const format = (s) => s.split('').reduce((acc, c) => c.match(/[A-Z]/) ? acc + ` ${c}` : acc + c, '');
    
    console.log(format(s));
    
  • 1

    您可以使用以下正则表达式:

    /(?<=\S)(?=[A-Z])/g

    replace 将在非空格后跟大写字母的字符之间插入间隔 .

    见下面的例子:

    let str = "thisIsThisTuesday Day";
    const res = str.replace(/(?<=\S)(?=[A-Z])/g, ' ');
    
    console.log(res);
    

    Note: 正如所指出的那样 ?<= (正面观察)目前并非在所有浏览器中都可用 .

  • 0

    另一个正则表达式变化:

    s = "thisIsThisTuesday Day"
    t = s.replace(/\B(?=[A-Z])/g, ' ')
    console.log(t)
    

    正则表达式由两个断言(=条件)和读取组成

    \B =当前位置(=光标)在两个字母之间或两个非字母之间

    (?=[A-Z]) =光标右侧的字符是大写字母

相关问题