求个截取字符串的写法

讨厌走开啦
博客专家认证
2019-01-08 03:57:06
有个长字符串要进行多次截取,已知需要截取的位置,类似[[0,1], [3,4], [7,8]]这样,如果不对截取位置进行排序(感觉排序就很蠢),可以怎么截取出想要的结果。
...全文
252 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanzhi_2016 2019-01-08
  • 打赏
  • 举报
回复
引用 15 楼 讨厌走开啦 的回复:
[quote=引用 12 楼 yanzhi_2016 的回复:]
[quote=引用 10 楼 讨厌走开啦 的回复:]
[quote=引用 8 楼 Hello World, 的回复:]


<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<input type="text" value="" style="width: 500px;" id="text" />
<input type="button" onclick="DoSlice();" value="DO!" />
</body>
</html>
<script>
var positions = [[0, 1], [3, 4], [7, 8]];
function DoSlice() {
var t = document.getElementById('text').value, r = '';
t.replace(/./g, function (item, index) {
for (var i = 0, l = positions.length; i < l; i++) {
if (index <= positions[i][1] && index >= positions[i][0]) {
item = '';
break;
}
}
r += item;
});
alert(r);
}
</script>


这个思路好,棒棒喔。[/quote]
我看这个输出结果和预期结果不一致呢?[/quote]

我没用他的代码,我只是参考了他的处理逻辑。[/quote]
思路确实不错
讨厌走开啦 2019-01-08
  • 打赏
  • 举报
回复
引用 14 楼 天际的海浪 的回复:
优化一下


var arr = [[0, 1], [7, 8], [3, 4]];
var str = "0123456789";
var t = str.split("");
arr.forEach(function(v){
	for (var i = v[0]; i < v[1]; i++)
		t[i] = "";
});
str = t.join("");
alert(str);

基本思路和8楼差不多,都是把范围内索引对应的值替换为空,可惜已经结了,不过还是爱你哦,大佬。
讨厌走开啦 2019-01-08
  • 打赏
  • 举报
回复
引用 12 楼 yanzhi_2016 的回复:
[quote=引用 10 楼 讨厌走开啦 的回复:] [quote=引用 8 楼 Hello World, 的回复:]

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <input type="text" value="" style="width: 500px;" id="text" />
    <input type="button" onclick="DoSlice();" value="DO!" />
</body>
</html>
<script>
    var positions = [[0, 1], [3, 4], [7, 8]];
    function DoSlice() {
        var t = document.getElementById('text').value, r = '';
        t.replace(/./g, function (item, index) {
            for (var i = 0, l = positions.length; i < l; i++) {
                if (index <= positions[i][1] && index >= positions[i][0]) {
                    item = '';
                    break;
                }
            }
            r += item;
        });
        alert(r);
    }
</script>
这个思路好,棒棒喔。[/quote] 我看这个输出结果和预期结果不一致呢?[/quote] 我没用他的代码,我只是参考了他的处理逻辑。
天际的海浪 2019-01-08
  • 打赏
  • 举报
回复
优化一下


var arr = [[0, 1], [7, 8], [3, 4]];
var str = "0123456789";
var t = str.split("");
arr.forEach(function(v){
	for (var i = v[0]; i < v[1]; i++)
		t[i] = "";
});
str = t.join("");
alert(str);

天际的海浪 2019-01-08
  • 打赏
  • 举报
回复

var arr = [[0, 1], [7, 8], [3, 4]];
var str = "0123456789";
var t = str.split("");
arr.forEach(function(v){
	for (var i = v[0]; i < v[1]; i++)
		t[i] = "\x01";
});
str = t.join("").replace(/\x01/g,"");
alert(str);

yanzhi_2016 2019-01-08
  • 打赏
  • 举报
回复
引用 10 楼 讨厌走开啦 的回复:
[quote=引用 8 楼 Hello World, 的回复:]


<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<input type="text" value="" style="width: 500px;" id="text" />
<input type="button" onclick="DoSlice();" value="DO!" />
</body>
</html>
<script>
var positions = [[0, 1], [3, 4], [7, 8]];
function DoSlice() {
var t = document.getElementById('text').value, r = '';
t.replace(/./g, function (item, index) {
for (var i = 0, l = positions.length; i < l; i++) {
if (index <= positions[i][1] && index >= positions[i][0]) {
item = '';
break;
}
}
r += item;
});
alert(r);
}
</script>


这个思路好,棒棒喔。[/quote]
我看这个输出结果和预期结果不一致呢?
yanzhi_2016 2019-01-08
  • 打赏
  • 举报
回复
let str = 'abcdefghijklmn';
let index = [[0, 1], [7, 8], [3, 5]];
function clear(str, index) {
index.forEach(item => {
let subStr = str.substring(item[0], item[1]);
str = str.replace(subStr, new Array(subStr.length).fill('$').join(''));
})
return str.replace(/\$/g, '');
}
console.log(clear(str, index));
讨厌走开啦 2019-01-08
  • 打赏
  • 举报
回复
引用 8 楼 Hello World, 的回复:

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <input type="text" value="" style="width: 500px;" id="text" />
    <input type="button" onclick="DoSlice();" value="DO!" />
</body>
</html>
<script>
    var positions = [[0, 1], [3, 4], [7, 8]];
    function DoSlice() {
        var t = document.getElementById('text').value, r = '';
        t.replace(/./g, function (item, index) {
            for (var i = 0, l = positions.length; i < l; i++) {
                if (index <= positions[i][1] && index >= positions[i][0]) {
                    item = '';
                    break;
                }
            }
            r += item;
        });
        alert(r);
    }
</script>
这个思路好,棒棒喔。
讨厌走开啦 2019-01-08
  • 打赏
  • 举报
回复
引用 7 楼 yanzhi_2016 的回复:

  let str = 'abcdefghijklmn';
  let index = [[0, 1], [7, 8], [3, 5]];
  function clear(str, index) {
    let clearStr = [];
    // 取到需要去掉的字符串
    index.forEach(item => {
      clearStr.push(str.substring(item[0], item[1]));
    });
    // 将需要去掉的字符串替换为空字符串
    clearStr.forEach(item => {
      str = str.replace(item, '');
    })
    return str;
  }
  console.log(clear(str, index));
这样不行的,这种只能处理字符串里没有重复信息的情况。比如字符串abcab,要去掉的是[[3, 4]],实际我要的是abcb,但是replace会把第一个a干掉,变成bcab。
Hello World, 2019-01-08
  • 打赏
  • 举报
回复


<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<input type="text" value="" style="width: 500px;" id="text" />
<input type="button" onclick="DoSlice();" value="DO!" />
</body>
</html>
<script>
var positions = [[0, 1], [3, 4], [7, 8]];
function DoSlice() {
var t = document.getElementById('text').value, r = '';
t.replace(/./g, function (item, index) {
for (var i = 0, l = positions.length; i < l; i++) {
if (index <= positions[i][1] && index >= positions[i][0]) {
item = '';
break;
}
}
r += item;
});
alert(r);
}
</script>
yanzhi_2016 2019-01-08
  • 打赏
  • 举报
回复

let str = 'abcdefghijklmn';
let index = [[0, 1], [7, 8], [3, 5]];
function clear(str, index) {
let clearStr = [];
// 取到需要去掉的字符串
index.forEach(item => {
clearStr.push(str.substring(item[0], item[1]));
});
// 将需要去掉的字符串替换为空字符串
clearStr.forEach(item => {
str = str.replace(item, '');
})
return str;
}
console.log(clear(str, index));
讨厌走开啦 2019-01-08
  • 打赏
  • 举报
回复
引用 5 楼 讨厌走开啦 的回复:
[quote=引用 4 楼 丰云 的回复:] 原字符串不变,这样相对位置就不会变,通过操作得到一个新串返回就行了
不排序怎么操作?要去掉的索引列表是[[0,1], [3,4], [7,8]],对应实际需要的是[[1,2], [4,6], [8,9]]里面的内容。如果不对[[0,1], [3,4], [7,8]]进行排序计算,怎么拿到[[1,2], [4,6], [8,9]]这个列表?或者有其他办法可以直接用[[0,1], [3,4], [7,8]]截出我要的字符串?[/quote] 补充一下,[[0,1], [3,4], [7,8]]这个可不一定是顺序排的,也有可能是[[7,8], [0,1], [3,4]],所以没法直接遍历去算出[[0,1], [3,4], [7,8]]。
讨厌走开啦 2019-01-08
  • 打赏
  • 举报
回复
引用 4 楼 丰云 的回复:
原字符串不变,这样相对位置就不会变,通过操作得到一个新串返回就行了
不排序怎么操作?要去掉的索引列表是[[0,1], [3,4], [7,8]],对应实际需要的是[[1,2], [4,6], [8,9]]里面的内容。如果不对[[0,1], [3,4], [7,8]]进行排序计算,怎么拿到[[1,2], [4,6], [8,9]]这个列表?或者有其他办法可以直接用[[0,1], [3,4], [7,8]]截出我要的字符串?
丰云 2019-01-08
  • 打赏
  • 举报
回复
原字符串不变,这样相对位置就不会变,通过操作得到一个新串返回就行了
讨厌走开啦 2019-01-08
  • 打赏
  • 举报
回复
引用 2 楼 丰云 的回复:
遍历循环截取就行了,用substring函数取,这不是很清楚的事吗? 你的问题点到底是什么?
问的不对 更正一下 [[0,1], [3,4], [7,8]]这个是要去掉的位置索引 这样的话 怎么截取比较快(不排序的话)?
丰云 2019-01-08
  • 打赏
  • 举报
回复
遍历循环截取就行了,用substring函数取,这不是很清楚的事吗? 你的问题点到底是什么?
讨厌走开啦 2019-01-08
  • 打赏
  • 举报
回复
哦 搞定了,突然感觉自己很蠢。

87,997

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧