Ofe*_*all 237 javascript regex jquery
在我的代码中,我基于分割字符串_并获取数组中的第二项.
var element = $(this).attr('class');
var field = element.split('_')[1];
Run Code Online (Sandbox Code Playgroud)
需要good_luck并提供给我luck.效果很好!
但是,现在我有一个看起来像的课程good_luck_buddy.如何让我的javascript忽略第二个_并给我luck_buddy?
我var field = element.split(new char [] {'_'}, 2);在ac#stackoverflow中找到了这个答案,但它不起作用.我在jsFiddle试了一遍......
Mar*_*ark 363
使用捕获括号:
"good_luck_buddy".split(/_(.+)/)[1]
"luck_buddy"
Run Code Online (Sandbox Code Playgroud)
它们被定义为
如果
separator包含捕获括号,则在数组中返回匹配的结果.
所以在这种情况下我们想要拆分_.+(即拆分分隔符是一个以字母开头的子字符串_),但也让结果包含我们分隔符的某些部分(即后面的所有内容_).
在此示例中,我们的分隔符(匹配_(.+))是_luck_buddy捕获的组(在分隔符内)lucky_buddy.没有捕获括号,luck_buddy(匹配.+)将不会包含在结果数组中,因为简单的情况split是分隔符不包含在结果中.
ken*_*bec 209
你需要什么正则表达式和数组?
myString = myString.substring(myString.indexOf('_')+1)
Run Code Online (Sandbox Code Playgroud)
var myString= "hello_there_how_are_you"
myString = myString.substring(myString.indexOf('_')+1)
console.log(myString)Run Code Online (Sandbox Code Playgroud)
yon*_*nas 31
我不惜一切代价避免使用RegExp.这是你可以做的另一件事:
"good_luck_buddy".split('_').slice(1).join('_')
Run Code Online (Sandbox Code Playgroud)
ont*_*rif 27
在解构赋值的帮助下,它可以更具可读性:
let [first, ...rest] = "good_luck_buddy".split('_')
rest = rest.join('_')
Run Code Online (Sandbox Code Playgroud)
Dar*_*Lee 13
这个解决方案对我有用
var str = "good_luck_buddy";
var index = str.indexOf('_');
var arr = [str.slice(0, index), str.slice(index + 1)];
//arr[0] = "good"
//arr[1] = "luck_buddy"
Run Code Online (Sandbox Code Playgroud)
或者
var str = "good_luck_buddy";
var index = str.indexOf('_');
var [first, second] = [str.slice(0, index), str.slice(index + 1)];
//first = "good"
//second = "luck_buddy"
Run Code Online (Sandbox Code Playgroud)
Kra*_*ken 13
Nowadays String.prototype.split does indeed allow you to limit the number of splits.
str.split([separator[, limit]])...
limit Optional
限制拆分数量的非负整数。如果提供,则在每次出现指定分隔符时拆分字符串,但在数组中放置限制条目时停止。任何剩余的文本根本不包含在数组中。
如果在达到限制之前到达字符串的末尾,则数组包含的条目可能少于限制。如果 limit 为 0,则不执行拆分。
它可能不会像您期望的那样工作。我希望它会忽略其余的分隔符,但是当它达到限制时,它会再次拆分剩余的字符串,从返回结果中省略拆分后的部分。
let str = 'A_B_C_D_E'
const limit_2 = str.split('_', 2)
limit_2
(2) ["A", "B"]
const limit_3 = str.split('_', 3)
limit_3
(3) ["A", "B", "C"]
Run Code Online (Sandbox Code Playgroud)
我希望:
let str = 'A_B_C_D_E'
const limit_2 = str.split('_', 2)
limit_2
(2) ["A", "B_C_D_E"]
const limit_3 = str.split('_', 3)
limit_3
(3) ["A", "B", "C_D_E"]
Run Code Online (Sandbox Code Playgroud)
seb*_*ace 11
用唯一的占位符替换第一个实例,然后从那里拆分.
"good_luck_buddy".replace(/\_/,'&').split('&')
["good","luck_buddy"]
Run Code Online (Sandbox Code Playgroud)
当需要拆分的两侧时,这更有用.
小智 11
获取字符串中的第一个键和剩余部分的简单 ES6 方法是:
const [key, ...rest] = "good_luck_buddy".split('_')
const value = rest.join('_')
console.log(key, value) // good, luck_buddy
Run Code Online (Sandbox Code Playgroud)
我需要字符串的两个部分,因此,正则表达式后视可以帮助我解决这个问题。
const full_name = 'Maria do Bairro';
const [first_name, last_name] = full_name.split(/(?<=^[^ ]+) /);
console.log(first_name);
console.log(last_name);Run Code Online (Sandbox Code Playgroud)
我运行了一些基准测试,这个解决方案大获全胜:1
str.slice(str.indexOf(delim) + delim.length)
// as function
function gobbleStart(str, delim) {
return str.slice(str.indexOf(delim) + delim.length);
}
// as polyfill
String.prototype.gobbleStart = function(delim) {
return this.slice(this.indexOf(delim) + delim.length);
};
Run Code Online (Sandbox Code Playgroud)
唯一的竞争者是同一行代码,除了使用substr代替slice.
我尝试过的涉及splitor RegExps 的其他解决方案对性能造成了很大的影响,并且速度慢了大约 2个数量级。当然,join在 的结果上使用split会增加额外的性能损失。
他们为什么慢?每当必须创建新对象或数组时,JS 都必须向操作系统请求一块内存。这个过程非常缓慢。
以下是一些一般准则,以防您追求基准:
{}或数组的新动态内存分配[](如split创建的)将在性能上花费很多。RegExp 搜索更复杂,因此比字符串搜索更慢。这是一个解决方案,它将切片到并包括第 n 个实例。它不是那么快,但在 OP 的问题上,gobble(element, '_', 1)仍然比 a RegExporsplit解决方案快 2 倍以上,并且可以做更多:
/*
`gobble`, given a positive, non-zero `limit`, deletes
characters from the beginning of `haystack` until `needle` has
been encountered and deleted `limit` times or no more instances
of `needle` exist; then it returns what remains. If `limit` is
zero or negative, delete from the beginning only until `-(limit)`
occurrences or less of `needle` remain.
*/
function gobble(haystack, needle, limit = 0) {
let remain = limit;
if (limit <= 0) { // set remain to count of delim - num to leave
let i = 0;
while (i < haystack.length) {
const found = haystack.indexOf(needle, i);
if (found === -1) {
break;
}
remain++;
i = found + needle.length;
}
}
let i = 0;
while (remain > 0) {
const found = haystack.indexOf(needle, i);
if (found === -1) {
break;
}
remain--;
i = found + needle.length;
}
return haystack.slice(i);
}
Run Code Online (Sandbox Code Playgroud)
使用上面的定义,gobble('path/to/file.txt', '/')将给出文件的名称,并gobble('prefix_category_item', '_', 1)像本答案中的第一个解决方案一样删除前缀。
您可以使用正则表达式,如:
var arr = element.split(/_(.*)/)
Run Code Online (Sandbox Code Playgroud)
将 stringreplace()方法与regex结合使用:
var result = "good_luck_buddy".replace(/.*?_/, "");
console.log(result);Run Code Online (Sandbox Code Playgroud)
此正则表达式匹配第一个_和_本身之前的 0 个或多个字符。然后匹配项将替换为空字符串。
| 归档时间: |
|
| 查看次数: |
186476 次 |
| 最近记录: |