查找非指定字符的索引

比方说,我有一个字符串

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)

2 years ago

实际上, 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”

2 years ago

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

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));

2 years ago

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

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

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

见下面的例子:

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

console.log(res);

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

2 years ago

另一个正则表达式变化:

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

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

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

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

2 years ago

你可以使用正则表达式:

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

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