A. ユースケース次第でどう実装すべきかは変わる。Intl.Segmenter が万能というわけでもない。 (クソ最悪な小バズをかましてしまったので、贖罪も兼ねて記事を書きました) 「文字数を数える」のは難しい 「文字数を数える」実装は意外と難しいです。というのも、アルファベットや数字だけなら str.length でも正しく数えられますが、絵文字や異体字などが入った文字列は見た目どおりに数えられません。
![文字数のカウントはどれが正解なのか?](https://cdn-ak-scissors.b.st-hatena.com/image/square/237d44bb9098c161facf4df3155b4383316379d4/height=288;version=1;width=512/https%3A%2F%2Fres.cloudinary.com%2Fzenn%2Fimage%2Fupload%2Fs--XuuTBcvx--%2Fc_fit%252Cg_north_west%252Cl_text%3Anotosansjp-medium.otf_55%3A%2525E6%252596%252587%2525E5%2525AD%252597%2525E6%252595%2525B0%2525E3%252581%2525AE%2525E3%252582%2525AB%2525E3%252582%2525A6%2525E3%252583%2525B3%2525E3%252583%252588%2525E3%252581%2525AF%2525E3%252581%2525A9%2525E3%252582%25258C%2525E3%252581%25258C%2525E6%2525AD%2525A3%2525E8%2525A7%2525A3%2525E3%252581%2525AA%2525E3%252581%2525AE%2525E3%252581%25258B%25253F%252Cw_1010%252Cx_90%252Cy_100%2Fg_south_west%252Cl_text%3Anotosansjp-medium.otf_37%3A%2525E3%252582%2525AF%2525E3%252583%2525AD%2525E3%252583%252591%2525E3%252583%2525B3%2525E3%252583%252580%252Cx_203%252Cy_121%2Fg_south_west%252Ch_90%252Cl_fetch%3AaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2ZhZDU2MWNjM2YuanBlZw%3D%3D%252Cr_max%252Cw_90%252Cx_87%252Cy_95%2Fv1627283836%2Fdefault%2Fog-base-w1200-v2.png)
A. ユースケース次第でどう実装すべきかは変わる。Intl.Segmenter が万能というわけでもない。 (クソ最悪な小バズをかましてしまったので、贖罪も兼ねて記事を書きました) 「文字数を数える」のは難しい 「文字数を数える」実装は意外と難しいです。というのも、アルファベットや数字だけなら str.length でも正しく数えられますが、絵文字や異体字などが入った文字列は見た目どおりに数えられません。
Vimでスネークケースとキャメルケースを相互に変換する方法を紹介します。 スネークケース -> キャメルケース 以下のような文字列を変換する hoge_fuga_piyo_foo_bar_baz コマンドラインモードで以下のように入力 :%s/\v_(.)/\u\1/g 結果 hogeFugaPiyoFooBarBaz スネークケース -> アッパーキャメルケース(パスカルケース) 以下のような文字列を変換する hoge_fuga_piyo_foo_bar_baz コマンドラインモードで以下のように入力 :%s/\v(^|_)(.)/\u\2/g 結果 HogeFugaPiyoFooBarBaz キャメルケース -> スネークケース 以下のような文字列を変換 hogeFugaPiyoFooBarBaz コマンドラインモードで以下のように入力 %s/\v([a-z]\@=)([A-Z])/\
Qiitaで書いた記事を微妙に書き直して、はてなブログに移行させます。 「ElasticSearchで正規表現やワイルドカード検索がしたい!」 という顧客要望に応えるため、何とかできないか試したときのメモ。 環境 ElasticSearch 結論 データ型がkeywordのフィールドに対しては、正規表現検索は有効 データ型がtextのフィールドに対しては、意図に沿わないことが多い 書かないこと 正規表現検索で劣化する性能の具体的な値 原因 データ型がkeywordはアナライザによる単語分割が行われないため、正規表現で目的の単語がヒットしやすいです。 データ型がtextのフィールドはアナライザによる文字数分割が行われます。 また、ワイルドカードを使用した場合は「A * B」で一単語と判断します。 一単語として扱うため、分割文字単位より長い単語をヒットさせることができません。 むしろワイルドカ
固定電話の場合0{市外局番1~4桁}-{市内局番1~4桁}-{加入者番号4桁}となっており、合わせて10桁、市外局番(国内プレフィックス含む)と市内局番をあわせて6桁固定となっているようです。(画像は総務省に掲載のもの) 他にも「010」から始まる国際電話番号プレフィックスや、警察(110)、消防(119)、時報(117)などありますが、今回は実装対象外とします。 携帯電話、PHSなど0A0-CDE-FGHJKの番号は、初期契約時の事業者を特定できますが、不要なので対象外とします。 ちなみに書いている途中で「オープンデータ化されていないのかな?」と思って検索してみたらされてました。 電気通信番号指定状況 が、上記ページのファイルへのリンクがあるだけでした。定期的にアップデートする仕組みとか作れるといいかなと思ったんですけどね。 実装 どう実装するか? 仕様はある程度理解できました。 固定電
文字クラス [abc] abcいずれか1文字 [^abc] abc以外の文字 [a-z] aからzまでの子文字アルファベットのいずれか1文字。(ハイフンなどを含めたい場合[-a-z]) [A-Z] AからZまでの大文字アルファベットのいずれか1文字 [0-9] 0-9の数字のいずれか1文字 [A-Za-z0-9] 結合したパターン。A-Zまたはa-zまたは0-9の英数字 [a-z&&[^bc]] bとcを除くa-z。[ad-z]と同義 (abc) カッコ内の文字列をひとつのグループとして管理する (abc|def) abc, defの文字列のいずれか (?:abc):肯定先読み abcに一致する文字列が始まる位置にある検索文字列と一致する。一致した文字列はキャプチャはされない。industry|industriesと指定する代わりに、industr(?:y|ies)と指定することができる。
import Foundation extension String { //絵文字など(2文字分)も含めた文字数を返します var length: Int { let string_NS = self as NSString return string_NS.length } //正規表現の検索をします func pregMatche(pattern: String, options: NSRegularExpression.Options = []) -> Bool { guard let regex = try? NSRegularExpression(pattern: pattern, options: options) else { return false } let matches = regex.matches(in: self, options: [], range: N
タイトル通りによく使う正規表現を毎回ググるのが効率悪いのでまとめてみました。各言語で正規表現のサンプルを書いてみました。 正規表現式 Emailアドレス ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ ドメイン名 ^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$ インタネットURL ^(http|https)://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ ユーザー名 (Twitter username) ^[a-zA-Z0-9_\-.]{3,15}$ 固定電話 ^0\d-\d{4}-\d{4}$ 携帯電話 ^(070|080|090)-\d{4}-\d{4}$ IP電話 ^050-\d{4}-\d{4}$ フリーダイヤル ^0120-\d{3}-\d{3}
PostgreSQLの文字列リテラルでは、バックスラッシュ文字の意味が standard_conforming_stringsという設定によって変わるようです。 standard_conforming_stringsが"off"のときは、バックスラッシュは特殊文字として 機能します。「\n」はAscii文字のLFで、「\t」はTABとして解釈されます。 一方、standard_conforming_stringsが"on"のときは標準SQL仕様準拠モードとなり、 バックスラッシュはただの「バックスラッシュという文字そのもの」として解釈されます。 「\n」は「\」と「n」の2文字となります。 このあたりことは以下のページの方が詳しいですのでそちらをどうぞ。 PostgreSQLは標準でバックスラッシュをエスケープしない仕様になった | 徳丸浩の日記 元々、標準のSQL仕様的には、バックスラッ
Perlの正規表現、 \G の項目がどうにも分からん! だって末尾に /g をつけたら最後まで検索しちゃうんでしょ? $html =~ s/\G\s*<h[1-6]>/<span class="dekamoji">/g; みたいなのが何の意味があるのさ? ↑つい二時間前まではこう思ってた。 でも、それは大きなミステイクだった。 \Gもまた、正規表現の能力を単なるマッチや置換から大幅にパワーアップさせてくれる要素だったんだ。 勘違いの始まりは、正規表現を学べば誰もが目にする s///g からだった。 $mojiretsu =~ s/hogehoge/fugafuga/g; とすると、検索文字列 $mojiretsu 中のすべての hogehoge を fugafuga に置換する。 でも、それだけだとあまりよい理解じゃなかったんだ。 s///g と似た形をしている、 m//g というコンテキ
このページは Perl5.6 を対象としています. perl スクリプトは EUC-JP で書かれることを想定しています. このページは 正規表現メーリングリスト を参考に,私が独自にメモとしてまとめたものです. このページの正規表現やスクリプトについての詳しい説明, わかりやすい説明はおそらくできません. このページに書かれているスクリプトは, 個人の責任において実行してください. このページに書かれているスクリプトの 利用・改造は自由 です. その際はどこかにこのページの URI( http://www.din.or.jp/~ohzaki/regex.htm )を参考として記述していただければ幸いです(任意). ご意見・ご感想・ご要望などは にお願いします.こう書いた方がいい, 動かん,わからん,バグってる,これ書け,などなどお待ちしています. このページへの リンクは自由 に張ってく
正規表現によるバリデーション等で、完全一致を示す目的で ^ と $ を用いる方法が一般的ですが、正しくは \A と \z を用いる必要があります。Rubyの場合 ^ と $ を使って完全一致のバリデーションを行うと脆弱性が入りやすいワナとなります。PerlやPHPの場合は、Ruby程ではありませんが不具合が生じるので \A と \z を使うようにしましょう。 はじめに 大垣さんのブログエントリ「PHPer向け、Ruby/Railsの落とし穴」には、Rubyの落とし穴として、完全一致検索の指定として、正規表現の ^ と $ を指定する例が、Ruby on Rails Security Guideからの引用として紹介されています。以下の正規表現は、XSS対策として、httpスキームあるいはhttpsスキームのURLのみを許可する正規表現のつもりです。 /^https?:\/\/[^\n]+$/
直前の記事「mb_ereg_replace関数でe修飾子を使う際の注意点」で利用しているmb_ereg_search_ナントカという関数群は特徴的な関数ですが、あまり使用例を見ない関数です。今回はこの関数群の概要を紹介します。 この関数群は正規表現マッチを行うmb_ereg系関数のバリエーションの一つです。前回正規表現マッチした場所を覚えていて、再度呼び出すと前回のマッチングに引き続いて正規表現マッチを行います。これを使うと、次のように正規表現マッチ毎に何かの処理を行うループが作れます。 <?php mb_ereg_search_init($subject, $pattern, $option); while (mb_ereg_search()) { $matches = mb_ereg_search_getregs(); // マッチした内容ごとの処理 } Perlだとm/../gでルー
ウノウラボ Unoh Labs: PHPのちょっとしたコツ 最近のスクリプト言語は機能が多く、基本的な機能はほとんど実装されているので、アルゴリズムをどうこうするより、どの機能を使うか選ぶ方が重要だったりしますね(コーディングの効率的にも)。 自分にもそういったレベルで気をつけていることがいくつかあります。 -[早起き生活]PHPのパフォーマンスチューニング -[早起き生活]PHPのパフォーマンスチューニング その2:count()も使い過ぎると重くなる -[早起き生活]PHPのパフォーマンスチューニング その3:APC投入 あと、最近気づいたTIPSとしては、 日本語を正規表現検索したいときでもereg系の関数を使うのはやめとけ なんてのもあります。 PHPの組み込み正規表現関数にはPHP独自のereg系とPerl互換のpreg系がありますが、ヘルプに書いてあるとおり、ereg系
こんにちは、中川です。 今回はJavaScriptで開発していると、うっかりハマってしまうちょっとした罠たちを紹介したいと思います。 JavaScriptでの開発経験者であれば、どれか一度はひっかかったことがあるのではないでしょうか? String ●String#replace()は文字列指定では全部置き換えない 対象文字列を一括して置き換えたいなどでString#replace()を使いますが、 検索対象を文字列で指定してしまうと最初に一致した部分しか置換しません。
遊:先生の話は 最近難しすぎるわ 少しは私の頭に合わせて 簡単にしてよ! 先生:…その台詞 言っていて 悲しくないか? 遊:ちょっとだけ 麗:それで 先生 今日の内容は 何ですか? 先生:あー すまん これはお前たちには 難しすぎるな 説明するのはやめるよ 麗:では 遊を除け者にして 話を進めてください 遊:何〜! それは許さん! 守:それで 今日の内容は 何ですか? 先生:『正規表現』だ 3人:正規表現!? 遊:何それ? 先生:文字列の検索や 置換を行うための 特殊なルールだ 遊:はー(姿勢を変える) この期に及んで 新しいルール? ルール ルール ルール! 私たち学生は 校則でがんじがらめよ! 遊:で それを使うと 世の中 手抜きで 渡っていけるの? 先生:渡っていける 他人の読書感想文を 書き換えて 自分のものに したりできる 遊:先生 ぜひ 教えてください 先生:それじゃあ 『置換
既にはてブ数が300近いサイトなんで、結構有名だとは思うんですが自分的にはかなり感動したのでご紹介。 ブラウザ上で正規表現のチェックができる「Rubular」というサービスです。 ページ上部の「Your regular expression」という項目に正規表現を入力し、その下の「Your test string」の項目に正規表現でチェックしたい文字列を入力。 すると、自動的に右下の「Match result」の項目にマッチした文字列が強調されて表示されます。 試しに、半角数字と半角の「.」(ドット)以外の文字が含まれているかどうかチェックする簡単な正規表現でテストしてみた結果が、以下のスクリーンショットです。 しっかり半角数字と半角の「.」(ドット)以外の文字が強調されているのが分かります。 さらに、以下のスクリーンショットのように、日本語の正規表現にも対応していることが判明。これは凄い
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く