ОШИБКА TypeError: Невозможно прочитать свойство '1' из null - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь проанализировать данные карточки, которые передаются через кард-ридер, однако я получаю сообщение об ошибке в отношении регулярного выражения. Я понимаю, это означает, что this.match имеет значение null, но я не уверен, почему он равен null. Какие-либо предложения? (С использованием Angular 9)

    CardData: string;
    CardPattern = new RegExp("^\%B(\d+)\^(\w+)\/(\w+)\^\d+\?;\d+=(\d\d)(\d\d)\d+$");
    CardNumber: string;
    FirstName: string;
    LastName: string;
    ExpData: string;
    match: RegExpExecArray;

    constructor(private snackbar: SnackBar) {
    }

    ngOnInit() {
        // getaCardData();
        this.CardData = "%B6545461234613451^DOE/JOHN^00000000000000000000000?;6545461234613451=984651465116111?"

        this.match = this.CardPattern.exec(this.CardData);

        this.CardNumber = this.match[1]
        this.FirstName = this.match[3];
        this.LastName = this.match[2];
        this.ExpData = this.match[5] + "/" +this.match[4];

        console.log(this.CardNumber);
    }

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Ваш шаблон не соответствует, потому что у вас есть дополнительный символ ? в конце вашей строки: this.CardData = %B6545461234613451^DOE/JOHN^00000000000000000000000?;6545461234613451=984651465116111?"

Замените его на:

this.CardData = "%B6545461234613451^DOE/JOHN^00000000000000000000000?;6545461234613451=984651465116111"

или вместо этого измените ваш шаблон с помощью: ^\%B(\d+)\^(\w+)\/(\w+)\^\d+\?;\d+=(\d\d)(\d\d)\d+\?$

Обновление: Добавлен фрагмент рабочего кода для вашей справки! Попробуйте добавить флаги, и это должно работать.

const regex = new RegExp(/^\%B(\d+)\^(\w+)\/(\w+)\^\d+\?;\d+=(\d\d)(\d\d)\d+\?$/, 'gm');
const input = `%B6545461234613451^DOE/JOHN^00000000000000000000000?;6545461234613451=984651465116111?`;
var match = regex.exec(input);

document.write(match.length);
0 голосов
/ 24 февраля 2020

Кажется, это как-то связано с escape-персонажем. Я пробовал Chrome Инструменты разработчика, работающие в следующих двух строках.

1. Without Template Literal
new RegExp("^\%B(\d+)\^(\w+)\/(\w+)\^\d+\?;\d+=(\d\d)(\d\d)\d+$").exec('%B6545461234613451^DOE/JOHN^00000000000000000000000?;6545461234613451=984651465116111?')

result: null

2. With Template Literal
new RegExp($`{"^\%B(\d+)\^(\w+)\/(\w+)\^\d+\?;\d+=(\d\d)(\d\d)\d+$"}`).exec('%B6545461234613451^DOE/JOHN^00000000000000000000000?;6545461234613451=984651465116111?')

result: ["O", index: 20, input: "%B6545461234613451^DOE/JOHN^00000000000000000000000?;6545461234613451=984651465116111?", groups: undefined]

Оборачивание выражения Regex в литерале шаблона должно решить проблему. Процесс компиляции, вероятно, принял во внимание символы подстановки во время сборки, что говорит о том, почему он работает после компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...