Как генерировать случайные строки, которые соответствуют данному regexp?

В JavaScript функции являются значениями. Это означает, что его можно использовать в любом контексте выражения, например, передавать значения в функции или возвращать из функций. Значение функции - это ее собственное имя. Не следует путать с возвращаемым значением функции .

Круглые скобки - это оператор JavaScript, используемый для создания выражений вызова функции , между другими вариантами использования.

В вашем случае вы передаете значение this.name для свойства onChange элемента React input. onChange ожидает, что function value будет вызван в ответ на событие изменения . Таким образом, сам React будет вызывать функцию, используя для этого в этом контексте оператор круглых скобок.

Если в противном случае вы написали this.name(), вы уже выполняете вызов функции, что приведет к ошибке, так как вы игнорируете ожидаемое поведение React.

20
задан Community 23 May 2017 в 12:25
поделиться

5 ответов

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

Это не работает для «регулярных» выражений, которые на самом деле не являются регулярными, например, для выражений с обратными ссылками. Это зависит от того, какое выражение вы ищете.

24
ответ дан 30 November 2019 в 00:48
поделиться

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

for (i = 0; i < 10; ++i) {
    do {
        var str = generateRandomString();
    } while (!myRegex.match(str));
    myListOfGoodStrings.push(str);
}

Конечно, это очень глупый способ сделать что-то, и в основном был задуман как шутка.

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

-1
ответ дан 30 November 2019 в 00:48
поделиться

Я взял пример, который предоставил Джек, и фактически создал рабочий проект, это было сделано с использованием Cocos2D 0.7.1 XCode Шаблон, а затем просто отредактируйте файлы * AppDelegate.m / .h, которые представлены ниже в полном объеме. Я также изменил кое-что из того, что сказал Джек, потому что я чувствую, что создание UITextField в appDidFinishLoading потребовало бы слишком много памяти, особенно если текстовое поле используется не все время ... это решение создает текстовое поле только тогда, когда оно требуется, образец рисует пустую сцену слоя Cocos2D, и при прикосновении к экрану он отображает текстовое поле, в которое вы можете начать ввод текста. Он выдаст результат того, что вы ввели в консоль - вы можете передать это всему, что необходимо в вашем собственном коде.

.h

#import <UIKit/UIKit.h>
#import "cocos2d.h"
@interface MYSCENE : Layer <UITextFieldDelegate>
{
    UITextField *myText;
}
-(void)specificStartLevel;
@end
@interface textFieldTestAppDelegate : NSObject <UIAccelerometerDelegate, UIAlertViewDelegate, UITextFieldDelegate, UIApplicationDelegate>
{
    UIWindow *window;
}
@end

, а затем.

6
ответ дан 30 November 2019 в 00:48
поделиться

Одно довольно уродливое решение, которое может или не может быть практичным заключается в использовании существующей опции диагностики регулярных выражений. Некоторые библиотеки регулярных выражений имеют возможность выяснить, где регулярное выражение не удалось сопоставить. В этом случае вы могли бы использовать то, что фактически является формой грубой силы, но используя по одному символу за раз и пытаясь получить более длинные (и более подходящие) строки, пока не получите полное совпадение. Это очень уродливое решение. Однако, в отличие от стандартного решения грубой силы, его сбой в строке типа ab ​​также скажет вам, существует ли строка ab. *, Которая будет соответствовать (если нет, остановите и попробуйте ac. Если так, попробуйте более длинную строку). Это, вероятно, неосуществимо со всеми библиотеками регулярных выражений.

С другой стороны, такое решение, вероятно, довольно круто с точки зрения обучения. На практике это, вероятно, похоже на решение dfa, но без необходимости думать о dfas.

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

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

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

0
ответ дан 30 November 2019 в 00:48
поделиться

The universality criterion is impossible. Given the regular expression "^To be, or not to be -- that is the question:$", there will not be ten unique random strings that match.

For non-degenerate cases:

moonshadow's link to Perl's String::Random is the answer. A Perl program that reads a RegEx from stdin and writes the output from ten invocations of String::Random to stdout is trivial. Compile it to either a Windows or Unix exe with Perl2exe and invoke it from PHP, Python, or whatever.

Also see Random Text generator based on regex

-2
ответ дан 30 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

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