Как проверить, содержит ли строка специальные специальные символы или начиная с пробела? [Дубликат]

ES6 предоставляет метод Array.from() , который создает новый экземпляр Array из объекта, подобного массиву или итерации.

let boxes = document.getElementsByClassName('box');

Array.from(boxes).forEach(v => v.style.background = 'green');
console.log(Array.from(boxes));
.box {
  width: 50px;
  height: 50px;
  margin: 5px;
  background: blue;
  display: inline-block;
}

Как вы можете видеть внутри фрагмента кода, после использования функции Array.from() вы можете манипулировать каждым элементом.

Это же решение с использованием jQuery.

$('.box').css({'background':'green'});
.box {
  width: 50px;
  height: 50px;
  margin: 5px;
  background: blue;
  display: inline-block;
}

7
задан stema 22 May 2012 в 10:26
поделиться

5 ответов

Я думаю, проблема в том, что есть? перед отрицанием белых пространств, что означает, что это необязательно

Это должно работать:

[a-zA-Z]{1}([a-zA-Z\s]*[a-zA-Z]{1})?

как минимум одна последовательность букв, затем необязательная строка с пробелами, но всегда заканчивается буквами

8
ответ дан stema 21 August 2018 в 19:17
поделиться
  • 1
    +1. До сих пор я не обращаю внимания на поддержку Unicode. – nhahtdh 22 May 2012 в 10:45
  • 2
    Нет, (?!\s*$) - отрицательный результат; он утверждает, что из текущей позиции (которая является началом строки, благодаря предыдущему ^), невозможно совместить нулевые или более пробельные символы, за которыми следует конец строки. Это неправильно, но не по той причине, которую вы предложили. Regex будет работать, но вы должны избавиться от {1} (который не имеет эффекта) и добавить привязки. Якоря являются необязательными, если вы используете метод matches() Java, но они помогают сигнализировать о ваших намерениях, и они облегчают перенос регулярного выражения в другие варианты. – Alan Moore 22 May 2012 в 11:01
  • 3
    спасибо за советы :-) – Sigal Shaharabani 22 May 2012 в 13:59
8
ответ дан stema 4 November 2018 в 16:28
поделиться

Попробуйте это:

^(((?<!^)\s(?!$)|[-a-zA-Z])*)$

Это выражение использует отрицательный lookahead и отрицательный lookbehind , чтобы запретить пробелы в начале или в конце строки и потребовать совпадения всю строку.

1
ответ дан dasblinkenlight 21 August 2018 в 19:17
поделиться
  • 1
    С вашим регулярным выражением возникает ошибка, снова проверьте скобки – Crazenezz 22 May 2012 в 10:00
  • 2
    @Crazenezz Спасибо, в конце отсутствовал ). – dasblinkenlight 22 May 2012 в 10:03
  • 3
    Не нужно так увлекаться. Как показали другие три респондента (пока), это случай, когда правильное соответствие тому, что вы делаем , достаточно, чтобы отфильтровать то, чего вы не хотите . – Alan Moore 22 May 2012 в 11:09
  • 4
    @AlanMoore What & quot; fancy & quot; вы говорите? В наши дни обходные круги являются основными. Выражение "соответствует букве или пробелу, кроме начала или конца ввода" , легко понять, помимо единственного решения, которое не повторяет класс символов [-A-Za-z]. Это просто синтаксис, который заставляет его выглядеть сложным, но по своей сути это тривиально. – dasblinkenlight 22 May 2012 в 11:16
  • 5
    Я говорю о том, зачем использовать сложный синтаксис, когда работает простой синтаксис? Как только вы знаете, что означают символы, очевидно, что не только ^[a-zA-Z]+(\s+[a-zA-Z]+)*$ соответствует именно тому, что требуется, но и делает это настолько эффективно, насколько это возможно. Согласно RegexBuddy, это регулярное выражение соответствует строке "Lorem ipsum tritani impedit civibus ei pri" всего за двадцать два шага, где yours принимает двести и двадцать два! – Alan Moore 22 May 2012 в 12:20

Это должно работать, если вы используете его с методом String.matches. Я предполагаю, что вам нужен английский алфавит.

"[a-zA-Z]+(\\s+[a-zA-Z]+)*"

Обратите внимание, что \s позволит использовать все типы пробельных символов. В Java это будет эквивалентно

[ \t\n\x0B\f\r]

, который включает в себя горизонтальную вкладку (09), подачу строки (10), возврат каретки (13), подачу формы (12), обратное пространство (08), пробел (32).

Если вы хотите специально разрешить только пробел (32):

"[a-zA-Z]+( +[a-zA-Z]+)*"

Вы можете дополнительно оптимизировать регулярное выражение выше, сделав захват group ( +[a-zA-Z]+) не захватывает String.matches вы не сможете получить слова отдельно). Также возможно изменить кванторы, чтобы сделать их притяжательными , так как здесь нет точки в обратном следе.

"[a-zA-Z]++(?: ++[a-zA-Z]++)*+"
8
ответ дан nhahtdh 21 August 2018 в 19:17
поделиться
  • 1
    Правильно, если вы используете метод matches() Java, но я все равно должен был бы привязать его: ^([a-zA-Z]+\s+)*[a-zA-Z]+$ – Alan Moore 22 May 2012 в 11:10
  • 2
    Да. Я предполагаю метод matches(). Спасибо за разъяснения. +1. – nhahtdh 22 May 2012 в 11:13

Я не знаю, могут ли слова в вашей принятой строке разделяться более чем одним пробелом. Если они могут:

^[a-zA-Z]+(( )+[a-zA-z]+)*$

Если не может:

^[a-zA-Z]+( [a-zA-z]+)*$

Строка должна начинаться с буквы (или нескольких букв), а не пробела.

Строка может содержать несколько слов, но каждое слово рядом с первым должно иметь место перед ней.

Надеюсь, я помог.

1
ответ дан Pshemo 21 August 2018 в 19:17
поделиться
  • 1
    OP спросил It cannot contain spaces at the beginning or end of the string., поэтому, если такой пример: <space><string><space><string><space>, результат будет <string><space><string>. Ваше регулярное выражение может решить этот <string><space><string>, если пользователь вводит проблему, подобную моему примеру, до того, как ваше регулярное выражение не сможет решить эту проблему. – Crazenezz 28 May 2012 в 07:51
  • 2
    Я не согласен. OP запросил regex для validating an input field. Поэтому для таких данных, как <space><string><space><string><space>, следует возвратить false, и это то, как работает мое регулярное выражение. – Pshemo 28 May 2012 в 09:43
  • 3
    После того, как я снова прочитал внимательно, возможно, мой разум поступил неправильно. Я думал, что если есть строка, подобная моему примеру выше, она проверит и удалит пробел до и после строки заполнения и покажет результат (Удивительно, что OP хочет поймать даже вход пользователя неправильно, как <space>Hello World<space>). – Crazenezz 28 May 2012 в 09:56
  • 4
    Я снова повторю голосование, но за 2 часа до повторного голосования. Надеюсь, я не испытываю к этому особого чувства :-) – Crazenezz 28 May 2012 в 09:57
Другие вопросы по тегам:

Похожие вопросы: