Шаблон, который вы использовали, не скомпилирован правильно из-за того, что \d
обрабатывается как escape-последовательность строки, а не escape-последовательность регулярного выражения. Для этого вам нужно удвоить обратную косую черту.
Кроме того, ваши альтернативы заключены с якорями ^
и $
. Хотя это правильно, оно выглядит неэффективно: имеет смысл поместить один ^
в начале и один $
в конце шаблона, обертывая альтернативы внутри группы, не захватывающей.
Кроме того, вы можете преобразовать все ваши группы захвата в не захватывающие (например, (...)
- (?:...)
), чтобы получить более высокую производительность, и заменить [/]
на простое /
, поскольку /
не требуется экранирование внутри конструктора RegExp
.
Итак, вы можете использовать
dateSubmitted: [null, [Validators.required, Validators.pattern('^(?:(?:10|12|0?[13578])/(?:3[01]|[12][0-9]|0?[1-9])/(?:1[8-9]\\d{2}|[2-9]\\d{3})|(?:11|0?[469])/(?:30|[12][0-9]|0?[1-9])/(?:1[8-9]\\d{2}|[2-9]\\d{3})|0?2/(?:2[0-8]|1[0-9]|0?[1-9])/(?:1[8-9]\\d{2}|[2-9]\\d{3})|0?2/29/[2468][048]00|0?2/29/[3579][26]00|0?2/29/[1][89][0][48]|0?2/29/[2-9][0-9][0][48]|0?2/29/1[89][2468][048]|0?2/29/[2-9][0-9][2468][048]|0?2/29/1[89][13579][26]|0?2/29/[2-9][0-9][13579][26])$')]],
См. обновленный Plunkr .
Из документации для CGEventCreateKeyboardEvent:
Необходимо ввести все нажатия клавиш, необходимые для создания символа, включая клавиши-модификаторы. Например, чтобы создать «Z», клавиша SHIFT должна быть нажата, клавиша «z» должна опускаться, а затем клавиши SHIFT и «z» должны быть освобождены:
blockquote>Таким образом, вы не можете просто нажать и освободить место с помощью модификатора опции, чтобы вызвать дополнительное пространство; вам нужно нажать опцию, нажать пробел, освободить место, вариант выпуска.
Как побочная заметка, opt-space по умолчанию ничего не делает; cmd-space - это горячая клавиша поиска Spotlight, а cmd-opt-space - горячая клавиша окна Spotlight.
Итак, этот код выведет поиск Spotlight:
- (void)execute { CGEventSourceRef src = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); CGEventRef cmdd = CGEventCreateKeyboardEvent(src, 0x38, true); CGEventRef cmdu = CGEventCreateKeyboardEvent(src, 0x38, false); CGEventRef spcd = CGEventCreateKeyboardEvent(src, 0x31, true); CGEventRef spcu = CGEventCreateKeyboardEvent(src, 0x31, false); CGEventSetFlags(spcd, kCGEventFlagMaskCommand); CGEventSetFlags(spcu, kCGEventFlagMaskCommand); CGEventTapLocation loc = kCGHIDEventTap; // kCGSessionEventTap also works CGEventPost(loc, cmdd); CGEventPost(loc, spcd); CGEventPost(loc, spcu); CGEventPost(loc, cmdu); CFRelease(cmdd); CFRelease(cmdu); CFRelease(spcd); CFRelease(spcu); CFRelease(src); }
Для всех, кто хочет получить список CGKeyCode, это функция из проекта RUI с частичной таблицей.
Хотя этот может быть более полный пример. Кто-нибудь знает более полную карту?
int keyCodeForKeyString(char * keyString); // get the Mac keycode for the RUI representation
int keyCodeForKeyString(char * keyString)
{
if (strcmp(keyString, "a") == 0) return 0;
if (strcmp(keyString, "s") == 0) return 1;
if (strcmp(keyString, "d") == 0) return 2;
if (strcmp(keyString, "f") == 0) return 3;
if (strcmp(keyString, "h") == 0) return 4;
if (strcmp(keyString, "g") == 0) return 5;
if (strcmp(keyString, "z") == 0) return 6;
if (strcmp(keyString, "x") == 0) return 7;
if (strcmp(keyString, "c") == 0) return 8;
if (strcmp(keyString, "v") == 0) return 9;
// what is 10?
if (strcmp(keyString, "b") == 0) return 11;
if (strcmp(keyString, "q") == 0) return 12;
if (strcmp(keyString, "w") == 0) return 13;
if (strcmp(keyString, "e") == 0) return 14;
if (strcmp(keyString, "r") == 0) return 15;
if (strcmp(keyString, "y") == 0) return 16;
if (strcmp(keyString, "t") == 0) return 17;
if (strcmp(keyString, "1") == 0) return 18;
if (strcmp(keyString, "2") == 0) return 19;
if (strcmp(keyString, "3") == 0) return 20;
if (strcmp(keyString, "4") == 0) return 21;
if (strcmp(keyString, "6") == 0) return 22;
if (strcmp(keyString, "5") == 0) return 23;
if (strcmp(keyString, "=") == 0) return 24;
if (strcmp(keyString, "9") == 0) return 25;
if (strcmp(keyString, "7") == 0) return 26;
if (strcmp(keyString, "-") == 0) return 27;
if (strcmp(keyString, "8") == 0) return 28;
if (strcmp(keyString, "0") == 0) return 29;
if (strcmp(keyString, "]") == 0) return 30;
if (strcmp(keyString, "o") == 0) return 31;
if (strcmp(keyString, "u") == 0) return 32;
if (strcmp(keyString, "[") == 0) return 33;
if (strcmp(keyString, "i") == 0) return 34;
if (strcmp(keyString, "p") == 0) return 35;
if (strcmp(keyString, "RETURN") == 0) return 36;
if (strcmp(keyString, "l") == 0) return 37;
if (strcmp(keyString, "j") == 0) return 38;
if (strcmp(keyString, "'") == 0) return 39;
if (strcmp(keyString, "k") == 0) return 40;
if (strcmp(keyString, ";") == 0) return 41;
if (strcmp(keyString, "\\") == 0) return 42;
if (strcmp(keyString, ",") == 0) return 43;
if (strcmp(keyString, "/") == 0) return 44;
if (strcmp(keyString, "n") == 0) return 45;
if (strcmp(keyString, "m") == 0) return 46;
if (strcmp(keyString, ".") == 0) return 47;
if (strcmp(keyString, "TAB") == 0) return 48;
if (strcmp(keyString, "SPACE") == 0) return 49;
if (strcmp(keyString, "`") == 0) return 50;
if (strcmp(keyString, "DELETE") == 0) return 51;
if (strcmp(keyString, "ENTER") == 0) return 52;
if (strcmp(keyString, "ESCAPE") == 0) return 53;
// some more missing codes abound, reserved I presume, but it would
// have been helpful for Apple to have a document with them all listed
if (strcmp(keyString, ".") == 0) return 65;
if (strcmp(keyString, "*") == 0) return 67;
if (strcmp(keyString, "+") == 0) return 69;
if (strcmp(keyString, "CLEAR") == 0) return 71;
if (strcmp(keyString, "/") == 0) return 75;
if (strcmp(keyString, "ENTER") == 0) return 76; // numberpad on full kbd
if (strcmp(keyString, "=") == 0) return 78;
if (strcmp(keyString, "=") == 0) return 81;
if (strcmp(keyString, "0") == 0) return 82;
if (strcmp(keyString, "1") == 0) return 83;
if (strcmp(keyString, "2") == 0) return 84;
if (strcmp(keyString, "3") == 0) return 85;
if (strcmp(keyString, "4") == 0) return 86;
if (strcmp(keyString, "5") == 0) return 87;
if (strcmp(keyString, "6") == 0) return 88;
if (strcmp(keyString, "7") == 0) return 89;
if (strcmp(keyString, "8") == 0) return 91;
if (strcmp(keyString, "9") == 0) return 92;
if (strcmp(keyString, "F5") == 0) return 96;
if (strcmp(keyString, "F6") == 0) return 97;
if (strcmp(keyString, "F7") == 0) return 98;
if (strcmp(keyString, "F3") == 0) return 99;
if (strcmp(keyString, "F8") == 0) return 100;
if (strcmp(keyString, "F9") == 0) return 101;
if (strcmp(keyString, "F11") == 0) return 103;
if (strcmp(keyString, "F13") == 0) return 105;
if (strcmp(keyString, "F14") == 0) return 107;
if (strcmp(keyString, "F10") == 0) return 109;
if (strcmp(keyString, "F12") == 0) return 111;
if (strcmp(keyString, "F15") == 0) return 113;
if (strcmp(keyString, "HELP") == 0) return 114;
if (strcmp(keyString, "HOME") == 0) return 115;
if (strcmp(keyString, "PGUP") == 0) return 116;
if (strcmp(keyString, "DELETE") == 0) return 117;
if (strcmp(keyString, "F4") == 0) return 118;
if (strcmp(keyString, "END") == 0) return 119;
if (strcmp(keyString, "F2") == 0) return 120;
if (strcmp(keyString, "PGDN") == 0) return 121;
if (strcmp(keyString, "F1") == 0) return 122;
if (strcmp(keyString, "LEFT") == 0) return 123;
if (strcmp(keyString, "RIGHT") == 0) return 124;
if (strcmp(keyString, "DOWN") == 0) return 125;
if (strcmp(keyString, "UP") == 0) return 126;
fprintf(stderr, "keyString %s Not Found. Aborting...\n", keyString);
exit(EXIT_FAILURE);
}
Для записи, в то время как ответ @ abarnert велик, и так вы должны это делать в соответствии с документацией, мой оригинальный код также работает. Я узнал, что у меня другая проблема, не имеющая отношения к этому вопросу.
Итак, если вам нужно применить клавиши-модификаторы к клавишам, вы можете просто добавить их как CGEventSetFlags(keyPress, modifierFlags);
, не нажимая на нажатие каждого ключа-модификатора отдельно. Этот подход работает, и я еще не нашел недостатков, и читаемость кода намного лучше.
XCode 7.3 и Swift 2.2:
let event1 = CGEventCreateKeyboardEvent(nil, 0x09, true); // cmd-v down
CGEventSetFlags(event1, CGEventFlags.MaskCommand);
CGEventPost(CGEventTapLocation.CGHIDEventTap, event1);
let event2 = CGEventCreateKeyboardEvent(nil, 0x09, false); // cmd-v up
CGEventSetFlags(event2, CGEventFlags.MaskCommand);
CGEventPost(CGEventTapLocation.CGHIDEventTap, event2);
Код выше имитирует CMD-V, затем отпущен (AKA: paste).