Javascript — 如果 StartsWith 则查找并剪切
Javascript — Find And Cut if StartsWith
我需要查看第一行文本是否以 By
开头,如果为真,则剪切整行并将其存储在变量中并删除所有空行,直到下一段开始。查找 By
的方法需要不区分大小写,并且它也可能有一些前面的空格。并且 do nothing
如果第一行不是以 By
.
开头
var findBy = 'By Bob';
if (findBy.startsWith('By ')) {
findBy = copyBy;
findBy.split("\n").slice(1).join("\n");
}
var pasteBy = copyBy;
让我重新表述一下:查找第一行是否以 By
开头,如果是,则将包含 By
的整行保存在一个变量中,然后将其删除。
调整 ...
function removeBy(textArray) {
var capture = false;
rebuild = [];
for (var i=0,len=textArray.length; i<len; i++) {
var s = textArray[i].trim();
if (s.substring(0,3).toUpperCase()==="BY ") {
capture = true;
} else if (capture && s!=="") {
capture = false;
}
if (capture) {
rebuild.push(s);
}
}
return rebuild;
}
此函数假设您要发送一个字符串数组和 returns 一个剥离的数组。
var answer = removeBy(["By Bob", "", "", "This is the result"]);
// answer = ["By Bob"];
Fiddle: http://jsfiddle.net/rfornal/ojL72L8b/
如果传入的数据用换行符分隔,可以使用.strip()
函数使textArray
;反过来,返回的rebuild
可以和answer.join("\n");
一起放回去
更新
根据评论,将 substring
更改为 (0,3)
并与 "BY "
(space) 进行比较,以仅关注 BY 而不是 BYA 之类的东西。
已更新 Fiddle:http://jsfiddle.net/rfornal/b5gvk48c/1/
如果我很了解你的要求,你可以使用这个正则表达式。
(可能不是最强大的,我根本不是正则表达式专家)
/^(\s\bby\b|\bby\b).*$/gmi
- 从最后一个修饰符开始的小演练:
g
全局,第一次出现时不会return。
m
multiline、^
和 $
将匹配 start/end 行,而不是字符串
i
不敏感,我打赌你明白了
- 现在,回到开始。
^
将在字符串的开头搜索
(x|y)
是一个有两个选项(x 或 y)的捕获组
\s\
是任何白色-space (\r\n\t\f)
\bword\b
是一个词 边界 ,例如它不会捕获 "words"
.*
匹配任意字符(换行符除外),直到
$
string/line 结束
//those should be found
var text = "by test 1 \n" +
" by test 2 \n" +
"By test 3 \n" +
" By test 4 \n" +
//Those should not
"test By 5 \n" +
"test by 6 \n" +
"Bya test 7 \n" +
"bya test 8 \n" +
" Bya test 9 \n" +
" bya test 10 \n";
var matchingLines = text.match(/^(\s\bby\b|\bby\b).*$/gmi);
document.querySelector('p').textContent = "|" + matchingLines.join("|") + "|";
<p/>
我需要查看第一行文本是否以 By
开头,如果为真,则剪切整行并将其存储在变量中并删除所有空行,直到下一段开始。查找 By
的方法需要不区分大小写,并且它也可能有一些前面的空格。并且 do nothing
如果第一行不是以 By
.
var findBy = 'By Bob';
if (findBy.startsWith('By ')) {
findBy = copyBy;
findBy.split("\n").slice(1).join("\n");
}
var pasteBy = copyBy;
让我重新表述一下:查找第一行是否以 By
开头,如果是,则将包含 By
的整行保存在一个变量中,然后将其删除。
调整 ...
function removeBy(textArray) {
var capture = false;
rebuild = [];
for (var i=0,len=textArray.length; i<len; i++) {
var s = textArray[i].trim();
if (s.substring(0,3).toUpperCase()==="BY ") {
capture = true;
} else if (capture && s!=="") {
capture = false;
}
if (capture) {
rebuild.push(s);
}
}
return rebuild;
}
此函数假设您要发送一个字符串数组和 returns 一个剥离的数组。
var answer = removeBy(["By Bob", "", "", "This is the result"]);
// answer = ["By Bob"];
Fiddle: http://jsfiddle.net/rfornal/ojL72L8b/
如果传入的数据用换行符分隔,可以使用.strip()
函数使textArray
;反过来,返回的rebuild
可以和answer.join("\n");
更新
根据评论,将 substring
更改为 (0,3)
并与 "BY "
(space) 进行比较,以仅关注 BY 而不是 BYA 之类的东西。
已更新 Fiddle:http://jsfiddle.net/rfornal/b5gvk48c/1/
如果我很了解你的要求,你可以使用这个正则表达式。
(可能不是最强大的,我根本不是正则表达式专家)
/^(\s\bby\b|\bby\b).*$/gmi
- 从最后一个修饰符开始的小演练:
g
全局,第一次出现时不会return。
m
multiline、^
和$
将匹配 start/end 行,而不是字符串
i
不敏感,我打赌你明白了 - 现在,回到开始。
^
将在字符串的开头搜索
(x|y)
是一个有两个选项(x 或 y)的捕获组
\s\
是任何白色-space (\r\n\t\f)
\bword\b
是一个词 边界 ,例如它不会捕获 "words"
.*
匹配任意字符(换行符除外),直到
$
string/line 结束
//those should be found
var text = "by test 1 \n" +
" by test 2 \n" +
"By test 3 \n" +
" By test 4 \n" +
//Those should not
"test By 5 \n" +
"test by 6 \n" +
"Bya test 7 \n" +
"bya test 8 \n" +
" Bya test 9 \n" +
" bya test 10 \n";
var matchingLines = text.match(/^(\s\bby\b|\bby\b).*$/gmi);
document.querySelector('p').textContent = "|" + matchingLines.join("|") + "|";
<p/>