読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

正規表現の文字クラスの重複を削除する

s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+

Perlメモ

の文字クラス部の範囲が重複していたので、重複を除去して短くしてくれる関数を書いた。ASCIIの範囲のみ対応。

function optimize(range) {
  var ascii = new Array(0x7f);
  var i, begin, end;
  var result = "";
  for (i = 0x00; i < ascii.length; ++i)
    ascii[i] = false;
  for (i = 0; i < range.length; ++i) {
    begin = range.charCodeAt(i);
    if (range.charAt(i+1) == "-")
      end = range.charCodeAt(i += 2);
    else
      end = begin;
    for (; begin <= end; ++begin)
      ascii[begin] = true;
  }
  for (i = 0; i < ascii.length; ++i) {
    if (!ascii[i])
      continue;
    begin = i;
    for (; ascii[i+1]; ++i)
      ;
    if (begin == i)
      result += String.fromCharCode(i) == "-"? "\\-":
        String.fromCharCode(i);
    else
      result += String.fromCharCode(begin) + "-" + String.fromCharCode(i);
  }
  return result;
}

optimize("-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#"); // "!#-;=?-Z_a-z~"

この関数を使うと、man asciiを見ながら手動で直した

/https?:\/\/[!#-;=?@-Za-z~]+/

http://twitter.com/javascripter/status/1365357786

が重複を除去しきれてないとすぐに分かってとても便利。