Typescript nodejs - шаблон Regex не работает внутри переменной - PullRequest
1 голос
/ 16 июня 2019

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

Может кто-нибудь объяснить, что не так с моим кодом? Или как я могу это исправить?

Спасибо:)

const strArray = ['(', 'ATT1', 'VARCHAR2', ')'];

const testingWord = (pString: string) => /^[^;() ]+$/g.test(pString);
strArray.map((word) => {
   console.log(word, testingWord(word));
});
// RESULT
// (        false
// ATT1     true
// VARCHAR2 true
// )        false

const PATTERN_WORD = /^[^;() ]+$/g;
const test = (pString: string) => PATTERN_WORD.test(pString);
strArray.map((word) => {
   console.log(word, testingWord(word));
});

// RESULT
// (        false
// ATT1     true
// VARCHAR2 false  <-- this should be true
// )        false

1 Ответ

2 голосов
/ 16 июня 2019

Вы только что обнаружили, почему использование флага g в регулярных выражениях может быть проблематичным.

Объект RegExp имеет свойство - lastIndex.Который устанавливается, когда объект используется для match (или test) строки, если используются флаги y или g.

Это свойство используется при определении, где начать сопоставление,так что если это не 0, ваше регулярное выражение может пропустить некоторые свойства.

Поскольку вы используете это регулярное выражение только с .test, избавьтесь от флага g.Это не изменит поведение регулярного выражения.

const PATTERN_WORD = /^[^;() ]+$/; // <-- here
const test = (pString: string) => PATTERN_WORD.test(pString);
strArray.map((word) => {
   console.log(word, testingWord(word));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...