Groovy: генерировать случайную строку из заданного набора символов - PullRequest
38 голосов
/ 15 ноября 2011

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

  • Допустимые символы: [A-Z0-9]
  • Длина сгенерированной последовательности: 9

Пример: A586FT3HS

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

Ответы [ 6 ]

62 голосов
/ 15 ноября 2011

Если вы не хотите использовать Apache Commons или не используете Grails, альтернатива:

def generator = { String alphabet, int n ->
  new Random().with {
    (1..n).collect { alphabet[ nextInt( alphabet.length() ) ] }.join()
  }
}

generator( (('A'..'Z')+('0'..'9')).join(), 9 )

но, опять же, вам нужно будет сделать свой alphabet самостоятельно ... Я не знаю ничего, что могло бы проанализировать регулярное выражение и извлечь алфавит из проходящих символов ...

46 голосов
/ 15 ноября 2011
import org.apache.commons.lang.RandomStringUtils

String charset = (('A'..'Z') + ('0'..'9')).join()
Integer length = 9
String randomString = RandomStringUtils.random(length, charset.toCharArray())

Импортированный класс RandomStringUtils уже находится в пути к классам Grails, поэтому вам не нужно ничего добавлять в путь к классам, если вы пишете приложение Grails.

Обновление

Если вы хотите, чтобы в строку включались только буквенно-цифровые символы, вы можете заменить вышеприведенное на

String randomString = org.apache.commons.lang.RandomStringUtils.random(9, true, true)
5 голосов
/ 25 мая 2015

Для пользователей SoupUI:

def generator = { String alphabet, int n ->
  new Random().with {
    (1..n).collect { alphabet[ nextInt( alphabet.length() ) ] }.join()
  }
}
randomValue = generator( (('A'..'Z')+('0'..'9')+('a'..'z')).join(), 15 )
testRunner.getTestCase().setPropertyValue("randomNumber", randomValue);
1 голос
/ 14 декабря 2017

Это однострочная команда / инструкция для генерации произвольной текстовой строки

print new Random().with {(1..9).collect {(('a'..'z')).join()[ nextInt((('a'..'z')).join().length())]}.join()}

или

def randText = print new Random().with {(1..9).collect {(('a'..'z')).join()[ nextInt((('a'..'z')).join().length())]}.join()}
1 голос
/ 15 ноября 2011

Создайте строку с вашим алфавитом, затем сделать это 9 раз:

  1. Создать случайное число
  2. Найдите соответствующий символ в вашем алфавите.
  3. Добавить к результату
0 голосов
/ 24 февраля 2017

Этот код чистый Groovy, который я нашел в Интернете:

def key
def giveMeKey(){
    String alphabet = (('A'..'N')+('P'..'Z')+('a'..'k')+('m'..'z')+('2'..'9')).join() 
    def length = 6
     key = new Random().with {
           (1..length).collect { alphabet[ nextInt( alphabet.length() ) ] }.join()
             }
            return key
        }

Возвращаемая строка достаточно хороша для локального использования:

BFx9PU
MkbRaE
FKvupt
gEwjby
Gk2kK6
uJmzLB
WRJGKL
RnSUQT
...