Проверка, если предоставлено String является действительным списком элементов - PullRequest
1 голос
/ 08 мая 2019

Я хочу проверить, формирует ли строка, предоставленная пользователем, список разделенных запятыми элементов (целые, строковые, смешанные - не имеет значения) в Groovy. Двумя основными требованиями является то, что список не может содержать пустых элементов, и в нем не должно быть пробелов. Таким образом, пример допустимых строк будет:

1,2,3
1,a,https://test
brown,fox,cat
EN,ES,XOO,ksSIj
test
?@)($,one,two

Хотя недействительными могут быть такие вещи, как:

,,,
12,,34
a, b, c

Каков наилучший способ сделать это в классной? Единственное, о чем я думал, это регулярное выражение типа [^,]+ (хотя этот допускает пробельные символы. Любые другие возможности или настройка этого регулярного выражения до тех пор, пока он не будет работать единственным способом - и если да, то какой будет наименее сложный способ выразить это? с регулярным выражением?

Ответы [ 3 ]

3 голосов
/ 08 мая 2019

Здесь вы можете использовать регулярное выражение:

/^[^\s,]+(?:,[^\s,]+)*$/

См. Демонстрационную версию регулярного выражения и график регулярных выражений:

enter image description here

Подробно:

  • ^ - начало строки
  • [^\s,]+ - 1+ символов, кроме пробела и запятой
  • (?:,[^\s,]+)* - 0 или более повторений
    • , - запятая
    • [^\s,]+ - 1+ символов, кроме пробелов и запятых
  • $ - конец строки.

Используйте косую строку в Groovy для определения регулярного выражения, чтобы использовать одну обратную косую черту с выходами регулярных выражений.

Кроме того, если вы используете ==~оператор, вам даже не нужны якоря ^ и $, поскольку ==~ оператор сопоставления регулярных выражений требует полного совпадения строк в Groovy:

def s = '1,a,https://test'
def regex = /[^\s,]+(?:,[^\s,]+)*/
print s ==~ regex

Вывод true или false, еслиВы добавляете запятую в конце.

См. это Groovy демо .

Если вам нужно использовать оператор =~, оставьте привязки:

def regex = /^[^\s,]+(?:,[^\s,]+)*$/
print s =~ regex
1 голос
/ 09 мая 2019

Если вы хотите сделать это в groovy без регулярных выражений, что может быть более разборчиво:

boolean isInvalid(String str) {
    def split = str.split(',')
    str.contains(" ") || !split.size() || !split.every{it}
}

возвращает true, если

  • Ввод содержит пробел или
  • разделение на , приводит к пустому массиву, или
  • Не каждый элемент в результирующем списке после разделения является "правдивым"
0 голосов
/ 08 мая 2019

Попробуйте это регулярное выражение:

^([^,\s]+)(,[^,]\S+)?$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...