2016-07-18 3 views
1

ページ番号を表す文字列が有効かどうかを確認する必要があります。そうでなければ、可能であれば文字列を適合させるべきです。ページ番号を表す文字列を変換して確認する

有効なページ番号は12または33-40です。

まずは33 - 40も有効にするために空白を削除します。また、私は特別なダッシュを置き換えています。

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

特別な何かが入力530-535に変換する必要があります形式530-5、であることができることです。 530-41530-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から535に変換されなければならない形式530から5であり得ることです。 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:コードは、極端なケースについて試験されていません。バグやエラーを自由に指摘してください。あなたのために修正します。正規表現の

関連する問題