2017-01-18 3 views
0

Мне сложно определить, как обрезать часть строки в JavaScript. Мне нужно удалить несоответствия, поскольку они поступают из БД. Надеюсь, кто-то может мне помочь.Попытка обрезать часть строки в JavaScript

На моей веб-странице У меня есть несколько вхождений 2 столовые ложки (33 г) и 2 столовые ложки (33G).

Мне нужно, чтобы все выглядело так: 2 tbsp (33g). Таким образом, в основном что-то между скобкой, пробелом нужно удалить. Как я могу добиться этого с помощью JS?

Вот мой код: $(".servingSize").html(servingSize.replace(" ", ""));

Это только удаляет пробелы перед скобками. Не уверен, что я делаю неправильно.

ответ

4

Метод replace, единственный способ заменить все вхождения совпадения в строке с аргументом regex. Правильный способ сделать это будет replace(/\s/g, ''). \s - специальный аргумент в регулярных выражениях, который соответствует всем пробельным символам.

В вашем случае, заменяя символы только в круглых скобках, вы можете использовать это регулярное выражение: servingSize.replace(/\s+(?=g)/g, ''). (?=g) - это положительный взгляд, который выбирает пробелы пробега с последующим символом g.

+1

Заметит, однако, что ОП сказал, что они только хотят, чтобы удалить пробела между скобками, тогда это будет удалить ВСЕ пробелы. –

+0

Да, это не работает. Это дает мне это: 2tbsp (33g) – Tom

+0

Я не думаю, что это проблема .... – epascarello

-1

использовать $ (". ServeSize"). Html (serveSize.replace ("g", "g")); Это будет заменить только пробел перед граммами, а не каждое пространство

+0

Предполагается, что будет только одно пустое пространство. Если бы был только один, это могло бы работать более надежно, если бы вы искали 'g 'вместо' 'g" '. –

1

Другим способом сделать это, чтобы заменить шаблон:

servingSize.replace(/\((\s*)(\d+)(\s*)(\w+)(\s*)\)/g, '($2$4)'); 

Предполагая, что образец всегда кронштейн ( с последующим числом, а затем одну или несколько букв и другую скобку ), мы можем сопоставить любое окружающее пространство и просто не включать эти группы в замену. Это работает и для любого другого устройства.

Если вы ищете и заменить весь HTML-страницы, я бы дополнительно зафиксировать его вниз, чтобы быть более точным, на всякий случай:

servingSize.replace(/(\d+ (?:tbsp|tsp))\s\((\s*)(\d+)(\s*)(\w+)(\s*)\)/g, '$1 ($3$5)'); 

(хотя, если вы используете JQuery, чтобы соответствовать конкретным элементам , первый из которых должен быть штраф)

Все, что между ( и ) в регулярном выражении отмечает группа, которые могут быть доступны по индексу, используя $ с последующим номером группы (0 в целом регулярное выражение соответствует строка, 1 начинается захват первой группы г). В формате str.Replace({regex}, s) строка s может содержать эти маркеры ${#}.

Примечание: Это будет обрабатывать любые пробелы вокруг совпавших элементов:

2 tbsp (33 g) =>2 tbsp (33g)

даже другие единицы вместо «г» в случае необходимости в будущем.

+0

очень полезно спасибо! – Tom

2

furkle определенно получил правильный ответ, но я собираюсь опубликовать альтернативное решение, которое обрабатывает случаи, когда вы не знаете, какие единицы находятся в круглых скобках.

var regexPattern= /^([^\(]*\([^ ]*)()([^\)]*\).*)$/; 

while (regexPattern.test(servingSize)) { 
    servingSize = servingSize.replace(regexPattern, "$1$3"); 
} 

$(".servingSize").html(servingSize); 

Узор ломается, как это:

/^ - начать в начале строки

([^\(]*\([^ ]*) - не захватить все символы вплоть до открывающей скобки, самой скобки, и любого не- пробельные символы, которые сразу же следуют за ним

() - захватить первый пробел в круглых скобках

([^\)]*\).*) - не захватить все символы вплоть до закрывающей скобки, сама скобка, и любых символов, которые следуют за ней

$/ - пройти весь путь до конца строки

Проверив его с .test() метод в цикле while, он будет запускать цикл, пока он все еще находит пробел внутри круглых скобок. Если он будет запущен, он заменит всю строку всеми символами до совпадающего пространства и всех символов после него.

Как только цикл не находит больше пробелов, он завершает работу и обновляет HTML.

Делая это таким образом, код работает для любых единиц, которые вы могли бы использовать:

  • "2 столовые ложки (33 г)" ===> "2 ст.л (33g)"
  • " 1 час (360 сек)»===> "1 час (360sec)"
  • "1 тонна (2000 фунтов)" ===> "1 тонна (2000lbs)"

Кроме того, это будет даже обрабатывать экстремальные примеры, такие как:

  • «2 столовых ложки (3 3 г)» ===> «2 ст.л (33g)»
+1

wow thats alot символов, но я вижу вашу точку. в моем случае у меня нет возможности ничего, кроме граммов, но я обязательно сохраню это в своем заднем кармане. спасибо, что нашли время, чтобы объяснить это! это определенно помогает мне лучше понять, как работает регулярное выражение. – Tom

+0

Рад, что это помогает. , , Я был привлечен к этому подходу пару лет назад (возможно, из ответа где-то здесь на SO;)) и использовал его несколько раз с тех пор. надеюсь, вы получите столько же пользы, сколько и я! : D – talemyn

Смежные вопросы