Понимание регулярных выражений \\s

Я пытаюсь понять определение схемы Json приведенного ниже фрагмента,

  "translated_string": {
    "description": "A translated string",
    "type": "string",
    "minLength": 1,
    "not": {
      "type": "string",
      "pattern": "^\\s+$"
    }
  },

Вопросы:

  1. что представляет собой \\s.

  2. некоторое объяснение фрагмента, приведя несколько примеров действительной схемы.


person Arun G    schedule 22.06.2017    source источник
comment
\\s представляет экранированный метасимвол пробела (см. Классы сокращенных символов). Что вы не можете понять во фрагменте?   -  person horcrux    schedule 22.06.2017
comment
@horcrux некоторое объяснение фрагмента, приводя несколько примеров для допустимых схем и недопустимых схем   -  person Arun G    schedule 22.06.2017
comment
^\\s+$ — это любая непустая строка, состоящая только из пробелов, но валидатор принимает НЕ от этого (так что все, кроме этого)   -  person Tezra    schedule 22.06.2017
comment
Почему против голосовать за вопрос?   -  person Arun G    schedule 22.06.2017


Ответы (1)


В синтаксисе регулярных выражений \s — это метасимвол, представляющий пробел (см. Классы сокращенных символов). В некоторых языках вам нужно дважды экранировать его из-за косой черты (например, \\s).

Давайте проанализируем регулярное выражение:

  • ^ это начало строки
  • \\s это пространство
  • + — это оператор, означающий «один или несколько»
  • $ это конец строки

Таким образом, шаблон соответствует строкам, состоящим только из хотя бы одного пробела и ничего больше.

Давайте теперь проанализируем фрагмент:

  • "description" — это просто описание, связанное со свойством translated_string.
  • "type": "string" означает, что в JSON можно использовать только строковое значение для свойства translated_string.
  • "not" means that the following is not permitted:
    • "pattern": "^\\s+$" is the regex above (so it must not be matched)

Обратите внимание, что фрагмент эквивалентен:

"translated_string": {
  "description": "A translated string",
  "type": "string",
  "not": {
    "type": "string",
    "pattern": "^\\s*$"
  }
},

(где оператор * означает "ноль или больше")
или еще проще:

"translated_string": {
  "description": "A translated string",
  "type": "string",
  "pattern": "^\\S+$"
},

(где \\S — это что угодно, только не пробел)

Итак, следующий JSON правильный:

"translated_string": "l"
"translated_string": " l"
"translated_string": " l "
"translated_string": "  l "

В то время как следующие JSON неверны:

"translated_string": ""
"translated_string": " "
"translated_string": "  "
"translated_string": 1
"translated_string": [ SOMETHING ]
"translated_string": { SOMETHING }
person horcrux    schedule 22.06.2017