У меня есть строка, которая представляет собой просто слова с одним пробелом между ними. Предполагая никаких специальных символов, я хотел бы совместить все слова, содержащие цифры, игнорируя 4-значные числа.
IE
hello12345 12345hello 123456789 12 red hello 1234 5678
Будет матч:
hello12345 12345hello 123456789 12
Конечной целью было бы заменить hello12345 12345hello 123456789 12
пустой строкой, в результате чего:
red hello 1234 5678
Следующие слова \w*\d\w*
соответствуют словам с цифрами и \b\d{4}\b
соответствуют всем 4-значным числам. Однако я не уверен, как их объединить.
Это регулярное выражение
/((\b(\d{1,3}|\d{5,})\b)|([a-z]+\d\w*|\w*\d[a-z]+))\s*/gi
Матчи:
// Digit-only words with less than or more than 4 digits
\b(\d{1,3}|\d{5,})\b
// Words that contain at least a number and a letter
[a-z]+\d\w*|\w*\d[a-z]+
включительно пробел между ними.
var string = "hello12345 12345hello 123456789 12 red hello 1234 5678";
var regex = /((\b(\d{1,3}|\d{5,})\b)|([a-z]+\d\w*|\w*\d[a-z]+))\s*/gi
console.log(string.replace(regex, ""));
Может быть, проще. Это только с головы.
Сопоставьте и захватите то, что вам нужно, и просто совместите то, что вам не нужно (см. "Лучший трюк с регулярным выражением"):
var re = /\b\d{4}\b|(\w*\d\w*)/g;
var str = "hello12345 12345hello 123456789 12 red hello 1234 5678";
var m, res = [];
while (m = re.exec(str)) {
if (m[1]) res.push(m[1]);
}
console.log(res);
Альтернатива \b\d{4}\b
соответствует только, а вторая, (\w*\d\w*)
, также захватывается с помощью группы захвата (...)
. Это значение сохраняется в группе 1, доступ к которой осуществляется через m[1]
.
\d{1,3}\b
? ../\b\d{4}\b|(\w*\d\w*)/g
и соберите группу 1 (если вам нужно извлечь).