Может ли регулярное выражение выбирать и игнорировать совпадения одновременно? - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть регулярное выражение 3 для обнаружения телефонов в большом тексте, которое затем заменяется на «(телефон)» по соображениям конфиденциальности.

var phoneNumber = /\(?(?:[0-9]{2,4})\)?[- . ]{0,}?(?:[0-9]{2,4})[- . ]{0,}?(?:[0-9]{2,4})/gim;

var separatePhone = /(\d\s){8,}\d/gim;

var textPhone = /((one|two|three|four|five|six|seven|eight|nine|zero|\d)\s){8,}(one|two|three|four|five|six|seven|eight|nine|zero|\d)/gim;

Затем я проверяю, совпадает ли мой текст с каждым.

Примеры:

I need 100000€ call me at 123456789 to talk about it.

Hi, can you buy this item (link) for $500.000? call me on +01123456789

Hi, can you buy this item (link) for £100000000? call me at 100000000

Проблема в этом тексте заключается в 100000€определяется как телефон.

Я хочу сопоставить телефоны, но не числа с €, $ или £ ($ и £ в начале числа), у меня уже есть (?![\€\$\£]\(?(?:[0-9]{2,4})), также я ужепопробуйте:

(?![\€\$\£]\(?(?:[0-9]{2,4}))(?=\(?(?:[0-9]{2,4})\)?[- . ]{0,}?(?:[0-9]{2,4})[- . ]{0,}?(?:[0-9]{2,4}))

Но это не работает.

Я проверяю это регулярное выражение в https://regex101.com/r/PJbIm9/14

Обновление:

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

/[^$€£0-9]((?:[0-9]{2,4})\)?[- . ]{0,}?(?:[0-9]{2,4})[- . ]{0,}?(?:[0-9]{2,4})+)/gim;

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вообще говоря, вы можете использовать следующий механизм:

(?: everything you do not want) | (important stuff)

Затем программно проверить, установлена ​​ли группа 1, например, для приведенных вами примеров:

(?:\$[\d.]+|\d+€)|(\d+)

Если выпознакомьтесь с другими валютами, измените левую ветвь в группе без захвата и при необходимости добавьте чередования.См. ваше измененное демо на regex101.com .


В JavaScript это будет

let data = `I need 100000€ call me at 123456789 to talk about it.

Hi, can you buy this item (link) for $500.000? call me on +01123456789`;

let rx = /(?:\$[\d.]+|\d+€)|(\d+)/g;
match = rx.exec(data);
while (match != null) {
    if (typeof(match[1]) != 'undefined')
        console.log(match[1]);
    match = rx.exec(data);
}
0 голосов
/ 21 декабря 2018

Почему бы не что-то простое, как это?

[^$€£0-9]([\d]+)[\s|.]

См. демонстрацию на regex101.com .

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