В моем коде я разбил строку на основе _
и получил второй элемент в массиве.
var element = $(this).attr('class');
var field = element.split('_')[1];
Берет good_luck
и предоставляет мне luck
. Прекрасно работает!
Но теперь у меня есть класс, который выглядит так good_luck_buddy
. Как мне заставить мой javascript игнорировать второе _
и дать мне luck_buddy
?
Я нашел это var field = element.split(new char [] {'_'}, 2);
в ответе ac # stackoverflow, но он не работает. Я попробовал это в jsFiddle ...
источник
_
сопоставляется внутри группы захвата и по этой причине добавляется в список токенов."Aspect Ratio: 16:9".split(/:(.+)/)
out:["Aspect Ratio", " 16:9", ""]
": 16:9"
, после разделителя ничего нет, поэтому в конце создается пустая строка.Для чего вам нужны регулярные выражения и массивы?
источник
_
, написав:myString.substring( myString.indexOf('_', myString().indexOf('_') + 1) + 1 )
var str = "good_luck_buddy", res = str.split(/_(.+)/);
вами вы получите все запчасти:console.log(res[0]); console.log(res[1]);
[ string.substring(0, string.indexOf(options.divider)), string.substring(string.indexOf(options.divider) + 1) ]
Вот и все. Также с поддержкой переменной иглыЯ избегаю RegExp любой ценой. Вот еще одна вещь, которую вы можете сделать:
источник
Замените первый экземпляр уникальным заполнителем, а затем разделите его.
Это более полезно, когда необходимы обе стороны разделения.
источник
Вы можете использовать регулярное выражение как:
Вы можете использовать второй параметр, который определяет предел разделения. то есть: var field = element.split ('_', 1) [1];источник
'good_luck_buddy'.split('_', 1);
возвращается только['good']
(:?.*)
должен быть не захватив группу? Если так, то так и должно быть(?:.*)
, но если вы исправите это, вы обнаружите, что оно больше не работает.(:?.*)
соответствует необязательному,:
за которым следует ноль или более любого символа. Это решение в конечном итоге работает по той же причине, что и @ MarkF: все, что после первого_
, добавляется в список токенов, потому что оно было найдено в группе захвата. (Кроме того,g
модификатор не имеет эффекта при использовании в регулярном выражении с разделением.)Это решение сработало для меня
ИЛИ
источник
В настоящее время
String.prototype.split
действительно позволяет ограничить количество расколов.предостережение
Это может работать не так, как вы ожидаете. Я надеялся, что он просто проигнорирует остальные разделители, но вместо этого, когда он достигнет предела, он снова разбивает оставшуюся строку, пропуская часть после разделения в возвращаемых результатах.
Я надеялся на:
источник
К
String.split
сожалению, в Javascript нет способа ограничить фактическое количество разделений. У него есть второй аргумент, который указывает, сколько фактических разделенных элементов возвращается, что бесполезно в вашем случае. Решением было бы разделить строку, сдвинуть первый элемент, а затем воссоединить оставшиеся элементы:источник
Мне нужны две части строки, так что, regex lookbehind поможет мне в этом.
источник
С помощью задания деструктуризации это может быть более читабельным:
источник
Самое быстрое решение?
Я провел несколько тестов , и это решение выиграло: 1
Сравнение производительности с другими решениями
Единственным близким соперником была та же строка кода, за исключением использования
substr
вместоslice
.Другие решения, которые я пытался задействовать,
split
илиRegExp
s имели большой удар по производительности и были примерно на 2 порядка медленнее. Использованиеjoin
по итогамsplit
, конечно, добавляет дополнительную потерю производительности.Почему они медленнее? Каждый раз, когда необходимо создать новый объект или массив, JS должен запросить кусок памяти у ОС. Этот процесс очень медленный.
Вот некоторые общие рекомендации, если вы гоняетесь за тестами:
{}
или массивов[]
(например, дляsplit
создаваемого) будут стоить очень дорого.RegExp
поиск более сложен и поэтому медленнее, чем поиск строк.Удаление за пределы первой инстанции
Вот решение, которое будет нарезано вплоть до n-го экземпляра. Это не так быстро, но, по мнению ОП,
gobble(element, '_', 1)
все еще> в 2 раза быстрее, чем решениеRegExp
или,split
и может сделать больше:С приведенным выше определением,
gobble('path/to/file.txt', '/')
даст имя файла иgobble('prefix_category_item', '_', 1)
удалит префикс, как первое решение в этом ответе.источник
Решение Марка Ф. является замечательным, но оно не поддерживается старыми браузерами. Решение Kennebec великолепно и поддерживается старыми браузерами, но не поддерживает регулярные выражения.
Итак, если вы ищете решение, которое разбивает вашу строку только один раз, которое поддерживается старыми браузерами и поддерживает регулярные выражения, вот мое решение:
источник
Для такого новичка, как я, который не привык к регулярным выражениям, это обходное решение сработало:
Метод slice () извлекает часть строки и возвращает новую строку, а метод indexOf () возвращает позицию первого найденного вхождения указанного значения в строке.
источник
Используйте строковый
replace()
метод с регулярным выражением :Это регулярное выражение соответствует 0 или более символам перед первым
_
и_
самим собой. Затем совпадение заменяется пустой строкой.источник
document.body.innerHTML
Часть здесь совершенно бесполезно.document.body.innerHTML
?document.body
зависит от наличия DOM и не будет работать в чистой среде JavaScript.console.log
для этого достаточно или просто оставьте результат в переменной для проверки.Это работало для меня на Chrome + FF:
Если вам также нужен ключ, попробуйте это:
источник
Вот один RegExp, который делает трюк.
Сначала это заставляет матч начинаться с начала с '^'. Затем он соответствует любому количеству символов, которые не являются «_», другими словами, все символы перед первым «_».
'?' означает, что минимальное количество символов, которые соответствуют целому шаблону, совпадает с '. *?' потому что за ним следует '_', который затем включается в совпадение в качестве последнего символа.
Поэтому этот метод split () использует такую подходящую часть, как «сплиттер», и удаляет ее из результатов. Таким образом, он удаляет все, вплоть до первого «_», и дает вам остальное как 2-й элемент результата. Первый элемент "" представляет часть перед соответствующей частью. Это "", потому что матч начинается с начала.
Есть и другие RegExps, которые работают так же, как /_(.*)/, данные Чанду в предыдущем ответе.
Преимущество /^.*?_/ заключается в том, что вы можете понять, что он делает, не зная особой роли групп захвата, выполняемых с replace ().
источник