JavaScript - MultiLine RegExp: lastIndex застревает на новых строках?

Просто предоставив тегу input переменную шаблона, #inputPhoneNumber назначит объектное представление JavaScript этого HTMLElement переменной шаблона.

Попробуйте это с помощью:

Input Field - With Just Template Varaible:

Phone number must only contain digits
Two Way Binding: {{phoneNumber}}
ViewChild Native Element: {{viewChildFirst?.nativeElement | json}}
ViewChild Control: {{viewChildFirst.control | json}}
#first: {{first?.value}}

И в классе компонентов:

@ViewChild('first') viewChildFirst;

Как совершенно очевидно, viewChildFirst.control не будет определяться в этом случае. [ 1117]


Но при назначении ngModel переменной шаблона будет назначено представление FormControl этого элемента HTML переменной шаблона.

Попробуйте это с помощью:

Input Field - With Template And ngModel assigned

Phone number must only contain digits
Two Way Binding: {{phoneNumber}}
ViewChild Native Element: {{viewChildSecond?.nativeElement}}
ViewChild Conttrol: {{viewChildSecond.control | json}}
#second: {{second?.value}}

А в классе компонентов:

@ViewChild('second') viewChildSecond;

На этот раз viewChildSecond?.nativeElement не будет определено, но viewChildSecond.control будет. [+1121]


Вы можете проверить это, точно распечатав переменную шаблона, как я делал выше. Вот рабочий образец StackBlitz для вашей ссылки.

BLOCKQUOTE>

8
задан 8 revs 23 May 2017 в 10:27
поделиться

2 ответа

Проблема состоит в том что точка в

^(.*)$

не соответствует символам новой строки, но с Вашим "m" переключатель Вы делаете "^" и "$" привязка к символам новой строки. Это не означает "ничто" между "\n" и "\n" может быть подобран успешно с "(.*)".

Так как это соответствие имеет нулевую ширину, lastIndex свойство не может совершенствоваться. Попробуйте:

^(.+)$

Править: Для соответствия пустым строкам также сделайте это:

^(.*)\n?     // remove all \r characters beforehand

или

^(.*)(?:\r\n|\n\r|\n|\r)?  // all possible CR/LF combinations, but *once* at most

... и просто пойдите для группы 1 соответствия.

7
ответ дан 5 December 2019 в 19:04
поделиться

Проблема с lastIndex состоит в том, что реализация JavaScript, которая следует стандарту к букве, устанавливает его на смещение следующего символа после соответствия. Для регулярных выражений, как Ваш, который позволяет соответствия нулевой длины, должностное лицо () таким образом застрянет в бесконечном цикле, когда соответствие нулевой длины будет найдено. Следующая попытка соответствия начнется в том же положении, где то же соответствие нулевой длины найдено.

Традиционно, regex механизмы имеют дело с этим путем пропуска одного символа, когда соответствие нулевой длины найдено. Кстати, Internet Explorer делает это также.

Я вел блог об этом подробно в прошлом: Не упустите Соответствия Нулевой Длины

2
ответ дан 5 December 2019 в 19:04
поделиться
Другие вопросы по тегам:

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