提问人:John dow 提问时间:11/8/2023 最后编辑:nageenJohn dow 更新时间:11/8/2023 访问量:71
如何在Typescript中以不同行结尾的字符串中找到子字符串索引
How to find a substring index in a string with different line ending in Typescript
问:
我有两根弦
- abcdef的
\r\n
- CDE技术
\n
我需要在字符串 2 中找到字符串 1 的索引。
我显然不能使用 ,所以我需要一些可以像它一样工作的东西,但考虑到了不同的行尾。indexOf()
我无法修改原始字符串,因为我需要原始字符串中的子字符串索引。如果我用它替换所有索引会弄乱原始索引,所以我必须以某种方式恢复它们。\r\n
\n
答:
3赞
T.J. Crowder
11/8/2023
#1
(FWIW,这个问题没有什么特定于 TypeScript 的。只是 JavaScript。
你可以通过将你要查找的字符串转换为正则表达式来做到这一点,在它有这些序列的任何地方使用交替,并确保转义中间的部分(请参阅这个问题的答案)。当您对第一个字符串使用生成的正则表达式的方法时,如果它匹配,则返回值(我们称之为 )将是匹配结果(增强型数组),索引可用 ,匹配的文本可用 。\r\n|\r|\n
exec
match
match.index
match[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)")
你需要对这些进行分组,否则会弄乱你的正则表达式|
评论