Я пытаюсь создать регулярное выражение, которое соответствует числам, большим или равным 150 000
, рассматривая пробелы как разделители тысяч. Вот регулярное выражение, которое я пробовал:
^(150\s*000|1[5-9]\d{2}(\s*\d{3})*|[2-9]\d{2}(\s*\d{3})*|\d{1,2}(\s*\d{3})+)$
Вот код JavaScript, который я использовал для его тестирования:
const regex = /^(150\s*000|1[5-9]\d{2}(\s*\d{3})*|[2-9]\d{2}(\s*\d{3})*|\d{1,2}(\s*\d{3})+)$/;
const testStrings = [
"149 000",
"151 000",
"185 000",
"800 152",
"15 000",
"100 000",
"200 000",
"250 000 123",
"100 0000",
"150 000",
];
testStrings.forEach(testString => {
const matches = testString.match(regex);
if (matches) {
console.info(`Matched: ${testString}`);
} else {
console.info(`Did not match: ${testString}`);
}});
Однако результаты не такие, как ожидалось:
Кажется, проблема связана с первой частью регулярного выражения. Что я делаю неправильно?
Я использую библиотеку, в которую мне нужно поместить это регулярное выражение в HTML, потому что это единственный способ разрешить это условие:
<input type = "radio" required name = "myname" cf-label = "Non" value = "non" cf-conditional-price = "^(150\s*000|1[5-9]\d{2}(\s*\d{3})*|[2-9]\d{2}(\s*\d{3})*|\d{1,2}(\s*\d{3})+)$" />
Согласен с @RoryMcCrossan... просто проведите числовое сравнение.
1[5-9]\d{2}
должно быть 1[5-9]\d
. 100 0000
не следует вашей логике регулярных выражений, где вы допускаете только пробелы между группами цифр. Если вас не волнуют пробелы в номере, просто удалите их перед проверкой.
Я использую библиотеку, в которой не могу изменить ввод, это только строки с отформатированными цифрами.
Regex не подходит для сравнения значений строк или чисел. Пожалуйста, рассмотрите возможность сделать то, что предложил @RoryMcCrossan.
@Jihane, тогда это идеально подходит для приведения типов и математического сравнения, а не для регулярных выражений.
И если вам нужно сопоставить даже любые пробелы между каждой цифрой, вам нужно их учитывать, т. е. ^\s*(?:1\s*5\s*0\s*0\s*0\s*0|1\s*[5-9]\s*\d(?:\s*\d\s*\d\s*\d)*|[2-9]\s*\d\s*\d(?:\s*\d\s*\d\s*\d)*|\d(?:\s*\d)?(?:\s*\d\s*\d\s*\d)+)\s*$
(см. демо).
По вашим правилам, "100 0000"
недействителен — так и должно быть? Вы утверждаете "не так, как ожидалось... не соответствует 100 0000" - но это правильно, оно не должно совпадать.
Почему вам следует использовать регулярное выражение?
Мы можем подойти к этому, сначала преобразуя строковые значения в числовые значения.
let testStrings = [
"149 000",
"151 000",
"185 000",
"800 152",
"15 000",
"100 000",
"200 000",
"250 000 123",
"100 0000",
"150 000",
];
testStrings = testStrings.map((str) => Number(str.replace(/\s/g, "")));
testStrings.forEach((value) => {
if (value >= 150000) {
console.info(`Matched: ${value}`);
} else {
console.info(`Did not match: ${value}`);
}
});
Ваш ответ, скорее всего, будет отклонен из-за дополнительной причины регулярного выражения: I have to put this regex in HTML because it is the only way to allow this condition
Ага, тему отредактировали после того, как я на нее ответил.
Вот регулярное выражение, которое, похоже, работает с вашими критериями любого числа >= 150 000 с пробелами, заменяющими запятые:
/\b((1[5-9]\d|[2-9]\d{2}|\d{4,})(\s\d{3})+)\b/
Теперь я настоятельно рекомендую несколько альтернативных маршрутов, предложенных в комментариях, но если вам действительно нужно использовать регулярное выражение, этот, похоже, работает нормально. Надеюсь это поможет!
Вот готовый код, заменяющий ваше регулярное выражение:
const regex = /\b((1[5-9]\d|[2-9]\d{2}|\d{4,})(\s\d{3})+)\b/;
const testStrings = [
"149 000",
"151 000",
"185 000",
"800 152",
"15 000",
"100 000",
"200 000",
"250 000 123",
"100 0000",
"150 000"
];
testStrings.forEach(testString => {
const matches = testString.match(regex);
if (matches) {
console.info(`Matched: ${testString}`);
} else {
console.info(`Did not match: ${testString}`);
}
});
Большое спасибо, это отлично работает. Я знаю, что регулярное выражение — не лучшее решение, но библиотека, которую я использую, ограничивает меня этим решением.
Пожалуйста, я понимаю ограничения, с которыми вы сталкиваетесь. Просто такое ощущение, что в библиотеке должен быть какой-то другой способ делать подобные вещи. Хотя это определенно может выйти из-под вашего контроля.
Всегда ли значения в массиве числовые? Если да, то я бы предложил более простое решение — привести их к числовому типу и просто использовать
>= 150_000