如何在Typescript中以不同行结尾的字符串中找到子字符串索引

How to find a substring index in a string with different line ending in Typescript

提问人:John dow 提问时间:11/8/2023 最后编辑:nageenJohn dow 更新时间:11/8/2023 访问量:71

问:

我有两根弦

  1. abcdef的\r\n
  2. CDE技术\n

我需要在字符串 2 中找到字符串 1 的索引。

我显然不能使用 ,所以我需要一些可以像它一样工作的东西,但考虑到了不同的行尾。indexOf()

我无法修改原始字符串,因为我需要原始字符串中的子字符串索引。如果我用它替换所有索引会弄乱原始索引,所以我必须以某种方式恢复它们。\r\n\n

JavaScript TypeScript 子字符串 行尾

评论

0赞 Alive to die - Anant 11/8/2023
输出应该是什么?
1赞 John dow 11/8/2023
输出应为“2”(abc\r\ndef 内字符串 c\nde 的从 0 开始的索引)

答:

3赞 T.J. Crowder 11/8/2023 #1

(FWIW,这个问题没有什么特定于 TypeScript 的。只是 JavaScript。

你可以通过将你要查找的字符串转换为正则表达式来做到这一点,在它有这些序列的任何地方使用交替,并确保转义中间的部分(请参阅这个问题的答案)。当您对第一个字符串使用生成的正则表达式的方法时,如果它匹配,则返回值(我们称之为 )将是匹配结果(增强型数组),索引可用 ,匹配的文本可用 。\r\n|\r|\nexecmatchmatch.indexmatch[0]

注释掉 TypeScript 类型注释的示例:

// From https://stackoverflow.com/a/3561711/157247
function escapeRegex(string) {
    return string.replace(/[/\-\\^$*+?.()|[\]{}]/g, '\\$&');
}

function test(str/*: string */, substr/*: string*/) {
    // Split up the text on any of the newline sequences,
    // then escape the parts in-between,
    // then join together with the alternation
    const rexText = substr
        .split(/\r\n|\n|\r/)
        .map((part) => escapeRegex(part))
        .join("\\r\\n|\\n|\\r");
    // Create the regex
    const re = new RegExp(rexText);
    // Run it
    const match = re.exec(str);
    if (match) {
        console.log(`Found ${JSON.stringify(match[0])} at index ${match.index} in ${JSON.stringify(str)}`);
    } else {
        console.log(`Not found`);
    }
}


test("abc\r\ndef", "c\nde");

评论

1赞 Thomas 11/8/2023
.join("(?:\\r\\n|\\n|\\r)")你需要对这些进行分组,否则会弄乱你的正则表达式|