2016-07-18 4 views
1

Мне нужно проверить, действительно ли строка - которая представляет номер страницы; иначе строка должна быть адаптирована, если это возможно.Преобразование и проверка строки, представляющей номера страниц

Действительный номер страницы может быть 12 или 33-40.

Так что прежде всего я удаляю пробелы, чтобы сделать 33 - 40 также действительным. Также я заменяю специальные тире.

value = value.replace(/\u2013|\u2014/g, '-').replace(/\s+/g, ''); 

Что-то особенное в том, что вход может быть в формате 530-5, который должен быть преобразован в 530-535. 530-41 должен получить 530-541. Я не знаю, как это сделать.

Далее я бы сделал тест, если есть только цифры или тире. Может быть, это не лучший способ ?!

value = /^[0-9\-]*$/.test(value) ? value : undefined; 

Примеры

342   // valid 
0   // invalid 
12-15  // valid 
12-5  // gets 12-15 
15-12  // invalid 
115-20  // gets 115-120 
115 - 20 // gets 115-120 
-20   // invalid 
+0

[ 'String.prototype.replace (регулярное выражение, функция)'] (https://developer.mozilla.org/en-US/docs/ Web/JavaScript/Reference/Global_Objects/String/replace # Using_an_inline_function_that_modifies_the_matched_characters) – Andreas

+0

@Andreas Извините, не орфографировал – user3142695

+0

Как насчет чего-то такого же смешного, как '100-5-20'? Должен ли быть отклонен или преобразован в «100-105», «100-120», «5-20» или что-то еще? Или даже случай '20-20', должен ли он быть отклонен или преобразован в' 20'? –

ответ

1
// create function to return normalised pagination 
function getPages(i){ 
    // match pattern to extract pages from valid strigs 
    // http://regexper.com/#/^\s*(\d+)\s*(?:(?:\u2013|\u2014|-)\s*(\d+)\s*)?$/ 
    var m = i.match(/^\s*(\d+)\s*(?:(?:\u2013|\u2014|-)\s*(\d+)\s*)?$/); 
    // if there is a match then validate, else return null immediately 
    if(m !== null && parseInt(m[1])) { 
     // get references to first and second page numbers 
     var from = parseInt(m[1]), 
      to = parseInt(m[2]); 
     // if there is a from and to page and to is greater than from... 
     if(to && to > from) return from + '-' + to; 
     // if there is from and to page and to is order of magnitude less than from 
     else if(to && m[2].length < m[1].length) return from + '-' + (m[1].substr(0, m[1].length - m[2].length) + to); 
     // if there is only from 
     else if(!to) return from + ''; 
     // finally, if nothing else matched, return null 
     else return null 
    } else { 
     return null; 
    } 
} 

['342', '0', '12-15', '12-5', '15-12', '115-20', '115 - 20', '-20'].forEach(i => console.log(getPages(i))) 

Объяснение регулярное выражение ... enter image description here

1

что-то особенное в том, что вход может быть в формате 530-5, который должен быть преобразован в 530-535. 530-41 должен получить 530-541. Я не знаю, как это сделать.

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

Plnkr

<script> 
    function getValidRange(pgNo) { 
     var pgNoS = pgNo.split('-'); 

     var len1 = pgNoS[0].toString().length; 
     var len2 = pgNoS[1].toString().length; 
     var multiplier = 1; 

     var newPage = ""; 

     if (Number(len1) > Number(len2)) { 
      for (var i = 0; i < len1 - len2; i++) { 
       newPage = newPage + pgNoS[0].toString()[i] + ""; 
      } 
      multiplier = Math.pow(10, pgNoS[1].toString().length); 
      pgNoS[1] = newPage + pgNoS[1]; 
     } 
     if (Number(pgNoS[1]) < Number(pgNoS[0])) { 
      pgNoS[1] = Number(pgNoS[1]) + multiplier; 
     } 
     return pgNoS[0].toString() + '-' + pgNoS[1].toString(); 
    } 

    document.write(getValidRange('12-5') + "<br>"); 
    document.write(getValidRange('530-41') + "<br>"); 
    document.write(getValidRange('530-28') + "<br>"); 
    document.write(getValidRange('536-5') + "<br>"); 
    document.write(getValidRange('5312328-5') + "<br>"); 
    document.write(getValidRange('5312328-345') + "<br>"); 
    document.write(getValidRange('5312328-1211') + "<br>"); 
</script> 

Выходной

12-15 
530-541 
530-628 
536-545 
5312328-5312335 
5312328-5312345 
5312328-5321211 

P.S .: Код не проверяется для крайних случаев. Не стесняйтесь указывать какие-либо ошибки/ошибки, и я исправлю их для вас.

Смежные вопросы