タグ

正規表現に関するlocke-009のブックマーク (76)

  • 今すぐ使える文字列処理 - Qiita

    はじめに パソコンを使ってお仕事をするということは、無数の文字列と向き合うことと同じです。その中でもエンジニアは、文字から離れることができません。 Wordに書かれたテキストをジョブカンに貼り付けたり、NginxのアクセスログをSpreadsheetに貼り付けたり、HTMLの差分をWinMergeに貼り付けたり……。 そして気が付けば、末尾の改行を取り払ったり、<div>タグの中のテキストを別ファイルに取り出したり、SQLで実行するIDにカンマをつけたり、ひとつひとつは単純でも、数が増えるとめんどくさい作業を繰り返していることに気づくでしょう。 文字列処理で、楽に、確実にやりましょう。 注意 ここでは、ひとつのツールにこだわらず「文字列を処理する」ことに特化したやりかたを記載していきます。 正規表現やコマンドの概念などはあまり説明しませんが、なんとなくのコピペで使えるような例を集めたつもり

    今すぐ使える文字列処理 - Qiita
  • サクラエディタでよく使う正規表現たち【備忘録】 - Qiita

    よくお世話になっている正規表現ですが、毎日使うものでもないので、なかなか覚えることができず。。。 使う度に検索するものもあるので、自分のための正規表現備忘録を作成することにしました。 データ整理などに使っているだけなので、偏りがあるかもしれません。 抽出条件一覧 全角文字だけ 半角文字だけ 数字だけ 指定した文字列より後(指定した文字列は含まない) 指定した文字列より前(指定した文字列は含まない) 指定した文字列以外 指定した文字列が含まれる行 指定した文字列で始まる行 指定した文字列が含まれる行以外 指定した文字列で始まる行以外 全角文字だけ

    サクラエディタでよく使う正規表現たち【備忘録】 - Qiita
  • 保守開発者のための正規表現入門 - Qiita

    正規表現とは 正規表現で検索するとたくさん解説しているサイトや記事が出てきますが私は以下のサイトの説明が端的でわかりやすいと思いました。 端的に言えば、「いくつかの文字列を一つの形式で表現するための表現方法」です。 では、なぜこの表現方法が有名なのかといえば、この表現方法を利用すれば、たくさんの文章の中から容易に見つけたい文字列を検索することができるためです。 よく利用するメタ文字(正規表現で文字列を表現するために利用される文字)についても事例を含めて解説されていますので、読んでみるとどういうものなのかが理解しやすいと思います。 より厳密に理解したい方や歴史について知りたい方はWikipediaの記事等を読んでみると良いと思います。 正規表現が使えると何がうれしいのか? 正規表現を利用するとテキストエディタ等で文字列の検索や置換を行う際にいろいろなことができるようになります。 ソースコード

    保守開発者のための正規表現入門 - Qiita
  • PHPの正規表現のuフラグっていつ使うの? - Qiita

    PHPのpreg_*系関数で使う正規表現は、区切り文字の後ろにいろいろなフラグを付けることができます。 その中で私が用途をすぐ理解できなかったuフラグについて書きます。 tl;dr uフラグなしだと、マルチバイト文字のマッチが思った通りにできない可能性がある uフラグによって\dや\wの挙動が変わる 注:以降の記述では、扱う文字列はすべてUTF-8であることを前提とします。 preg正規表現のuフラグ なにはともあれ公式マニュアルを確認します。 u (PCRE_UTF8) この修正子は、Perl 非互換な PCRE の機能を有効にします。パターンと対象文字列は、 UTF-8 として処理されます。 無効な対象文字列を preg_* 関数に渡しても、何もマッチしません。 無効なパターンを渡すと、E_WARNING レベルのエラーが発生します。 5オクテットおよび6オクテットの UTF-8 シー

    PHPの正規表現のuフラグっていつ使うの? - Qiita
  • 正規表現を自作してみる - Qiita

    はじめに ゼロから学ぶRustという書籍で正規表現エンジンの実装を学んだものの、理解が足らないので、自分でまとめたいと思います。 処理の流れ 正規表現は、例えば /ab*(a|c)+/ のような表現で文字列を表します。しかし、プログラムで処理するにはこの表現を扱いにくいです。そこで、まずはプログラムで扱いやすい形式に変換します。 その形式として使用されるのが、AST(Abstract Syntax Tree)です。ASTは正規表現の構造を木構造で表現するデータ構造です。ASTを作成することで、正規表現の解析やパターンマッチングのための処理を簡単に行うことができます。 次に、ASTを元にコード生成を行います。コード生成は、コンピュータが実際に実行する命令を生成するためのプログラムを記述する作業です。ASTを解析し、必要な命令や処理の手順を生成することで、正規表現を実際に処理するコードを生成す

    正規表現を自作してみる - Qiita
  • 正規表現でのURLのチェックとバイパス | 技術者ブログ | 三井物産セキュアディレクション株式会社

    最近はMBSDでWebアプリケーションスキャナの開発をしている寺田です。 Webアプリケーションを開発していると、セキュリティの観点でURLをチェックしなければならないことがしばしばあります。日の記事では、そのようなURLのチェックを如何に行うか、正規表現を使う場合の注意点や、バイパス方法などについて書きたいと思います。 記事で想定するのは、ブラウザからパラメータとして来るURLをチェックしてリダイレクトやリンクのURL等として使ったり、ブラウザから来たOriginヘッダ等のURLをチェックしてアクセス制御をするケースです。その中でも、以下のようにサブドメイン部分(★の部分)を可変にする状況を主に想定します。 https://★.example.jp/… よく使われてそうなチェック用の正規表現と、そのバイパスは以下のとおりです。 正規表現: ^https://.+\.example\.

    正規表現でのURLのチェックとバイパス | 技術者ブログ | 三井物産セキュアディレクション株式会社
  • 特定のパスからのアクセスか判定したい&RegExpとリテラルの差について(JS:正規表現) - Qiita

    Javascript(以下JS)で特定のパスからのアクセスか判定したい場合がありました。正規表現で対応しようと考えたのですが、意外に悩まされたので、簡単にまとめておこうと思います。完成したコードがこちら。 let pathname = '/index/5/edit/' if (new RegExp(/\/index\/.*\/edit/).test(pathname)) { console.debug('該当のURLからのアクセスです。'); } ここでは「/index/5/edit/」というパスからきた場合、debugで「該当のURLからのアクセスです。」という文言を表示させるようにしています。パスに含まれる5ですが、ここではユーザーIDとして、この部分は動的に変わることを想定しています。それでは正規表現の解説をしていきます。

    特定のパスからのアクセスか判定したい&RegExpとリテラルの差について(JS:正規表現) - Qiita
  • JavaScriptで平仮名(ひらがな)を判定する - Qiita

    regex = /*ここに何らかの正規表現*/; regex.test("あいうえお"); // -> true regex.test("あぁ"); // -> true regex.test("aiueo"); // -> false regex.test("あいueo"); // -> false regex.test("あい うえお"); // -> false

    JavaScriptで平仮名(ひらがな)を判定する - Qiita
  • 2023年の正規表現はじめ(パスワードの形式指定) - Qiita

    //8文字以上で、英小文字、英大文字、数字を1文字以上含む文字列 //※パスワードの形式指定でよくあるやつ ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9]{8,}$ う〜ん、兄も分かりません。 分からないところを調べた結果 (?=A) 前方参照。Aという文字があったら、(?=A)の直前の位置にマッチする。(マッチした位置に戻る) .* 任意の文字0文字以上 動作を日語にすると 任意の文字0文字以上+[a-z]にマッチしたら、文頭に戻る 任意の文字0文字以上+[A-Z]にマッチしたら、文頭に戻る 任意の文字0文字以上+[0-9]にマッチしたら、文頭に戻る その後[a-zA-Z0-9]が最低8回繰り返される文字列(+文末)とマッチする 前方参照の「文字ではなく、位置にマッチする」という性質に戸惑いましたが、調べがいがあって楽しかったです。 参考文献

    2023年の正規表現はじめ(パスワードの形式指定) - Qiita
  • シンプル図解: 正規表現の (?= ) とか (?! ) とか (?<= ) とか (?<! ) とか - Qiita

    入社1年目、趣味は整理整頓、 @pal4de です。 正規表現が大好きです。 先日投稿した記事が好評いただき当にうれしかったです。もっとたくさんの人に読んでもらいたい!!! さて、上の記事で紹介したのは単語境界 \b でしたが、これは先読み/後読みを駆使して下記の通りに表せると紹介しました。 便利な\bですらショートハンドに過ぎず、真に強力なものは 先読み(?=...)と後読み(?<=...) だということを主張したい!!! わかりすい図解も添えましたので、是非お楽しみください🏝️ 正規表現の記号は4種類 先読みの紹介に入る前に、改めて正規表現を俯瞰してみましょう。 誤解を恐れずに言えば、正規表現に出てくる記号の種類は4つしかないといえます1 2。 このようにとらえてみると、正規表現と向き合うのがだいぶ楽になります。体系化された理解への第一歩ですね 🗿 図にもある通り、 行頭 ^ も

    シンプル図解: 正規表現の (?= ) とか (?! ) とか (?<= ) とか (?<! ) とか - Qiita
  • 正規表現入門決定版 - Qiita

    1. はじめに この記事はNuco Advent Calendar 2022の12日目の記事です。 1-1. 対象者 この記事は ・正規表現に触れたことがあるけど、結局なんだったのかわかっていない ・正規表現の考え方にイマイチ慣れない ・正規表現って美味しいんですか? というような正規表現初心者の方に向けて書いています。 1-2. この記事を読むメリット 大きなメリットとしては「正規表現の考え方」を身につけることができるはずです。 また記事の最後では正規表現のサンプル集、参考記事および練習サイトを紹介しています。 足りない知識をカバーし実際に手を動かすことで身についていくので、この記事と合わせて参考記事を読んだり練習問題にチャレンジしてみてください。 2. 導入知識 2-1. 正規表現のメリット 具体的な話に入る前に、正規表現を使えばどのようなことができるのか紹介します。 正規表現を用いれ

    正規表現入門決定版 - Qiita
  • たった4文字でコード検索の精度がブチあがる正規表現 - Qiita

    まだまだ入社1年目、株式会社LIFULLの暴れ回る新卒、 @pal4de です。 正規表現が大好きです。 これは、その中でもとくにお気に入りな正規表現「単語境界 \b」の検索における威力を説き、褒め称える記事です。 「正規表現、まァ基は一通り勉強したな...」 というあなたにオススメしたい、ステップアップにピッタリなヤツです。 これは何? 改めて、 正規表現パターン \b は「単語境界」を表す記法です1。 Word BoundaryのBですね。 ここでは、「単語」は単語構成文字 \w = [A-Za-z0-9_] の連続と定義します2。 挙動の例 実際の挙動を見てみるとこんな感じ3。 正規表現 検索対象文字列 マッチする位置

    たった4文字でコード検索の精度がブチあがる正規表現 - Qiita
  • 覚え書き: 先読み・後読みを含む正規表現の数学的定式化

    いかにも既知な気がしますが、ぱっと既存の議論が探せないのでとりあえず書き出してみます。 ※用語は独自のものです。また、証明・定義は厳密に検証しているわけではないので誤りがあるかもしれません。 この定義でカバーできること 先頭 ^ 末尾 $ 肯定先読み (?= ... ) 否定先読み (?! ... ) 肯定後読み (?<= ... ) 否定後読み (?<! ... ) この定義でカバーしないこと 選択の左右の優先度 (r1|r2 vs. r2|r1) 最長優先と最短優先の区別 (r* vs. r*?) 基の正規表現 基の正規表現は通常以下のように定義されます。 \Sigma はアルファベットで有限サイズとします。 文字リテラル a (a は文字 a \in \Sigma) 空文字列 \epsilon と連接 R_1R_2 (R_1, R_2 は正規表現) 空集合 \emptyset と

    覚え書き: 先読み・後読みを含む正規表現の数学的定式化
  • 正規表現の先読み・後読み

    正規表現の「先読み(lookahead)」「後読み(lookbehind)」について紹介します。 正規表現の「位置へのマッチ」 正規表現は、文字列のパターンマッチに使われます。たとえば [0-9]{4} は数字4つが並ぶ文字列にマッチする表現です。 多くの正規表現は「文字列」にマッチしますが、「文字列」ではなく「位置」にマッチする表現があります。これは、アンカーと呼ばれます。また、長さ0の文字列にマッチすると考えて、ゼロ幅アサーションとも呼ばれます。 アンカーの例として、^(先頭)$(末尾)\b(単語の境界)などがあります。 この例では、cat にはマッチします。一方、category や concat は cat を含みますが前後が単語の境界になっていないためマッチしません。 先読み 先読み(lookahead)は、位置にマッチする記法の一種です。位置の指定に正規表現を使います。(?=

    正規表現の先読み・後読み
  • 「バグを意図的にバグのまま残す」という選択肢がある

    はじめに gcc v12.1において、C++の正規表現ライブラリstd::regexに、正規表現のバリデーションを改善するパッチ(以下"改善パッチ"と表記)が取り込まれました。改善パッチによって、これまではバリデーションにひっかからなかった不正な正規表現文字列が"正しく"不正なものと認識されて例外が発生するようになりました。 これだけ聞けばいいことだけのように思えるかもしれませんが、実はそうでもなかったりします。経験豊富なかたであれば見た瞬間ゾッとしたかもしれません。記事では、この一見問題なさそうな改善パッチによって発生しうる問題、および、その具体的例について紹介するとともに、この手のパッチを当てるかどうかは難しい判断になるという知見を共有します。 結論 改善パッチによって発生する問題 発生条件 gcc v12.1以降、あるいは改善パッチをバックポートされた任意のバージョンを使ってC++

    「バグを意図的にバグのまま残す」という選択肢がある
  • Powershellでの高度な置換 - Qiita

    Regexクラスを使う Powershellにはいくつかの置換方法が用意されている。 1. "文字列".Replace("old","new") 一番シンプルで高速。正規表現は使えない。

    Powershellでの高度な置換 - Qiita
  • 正規表現の脆弱性 (ReDoS) を JavaScript で学ぶ

    先日、このようなツイートを書いたところ、かなりの反響がありました。 JavaScript の正規表現の脆弱性の例でいうと、例えば /\s+$/ は脆弱性があると言える console.time(); /\s+$/.test(" ".repeat(65536) + "a"); console.timeEnd(); 結構時間がかかるのがわかる。でも /\s+$/ を見て「これは危険だな」と理解出来る人はそんなにいない。JavaScript に限らないけれど。 — Takuo Kihira (@tkihira) February 17, 2022 これは一般に ReDoS (Regular expression Denial of Service) と呼ばれる脆弱性です。正確に理解するのが難しい脆弱性なので、少し解説してみたいと思います。 結論 長い記事になるので、最初に「とりあえずこれだけ知っ

  • 正規表現の"正規"とは何か気になったら正規表現の歴史を紐解くことになってしまった話

    正規表現の"正規"って何 ある時ふと思いました。 「正規表現の"正規"って何だろう?」 「何を根拠に"正規"を名乗っているのか?」 と。 「誰かが『これが正規の表現だ』と言ったはず」で、 「それは周りにどうやって"正規"だと認められたのだろう」 ということが気になったので調べてみました。 "正規表現"という名前でなくて、"ジャックさんの表現"とか"記号ごちゃごちゃ表現"だったらこんな疑問も持たなかったのですけど。 数学における"正規"とは 一般に"正規"というと、"正規品"や"正規の手順"といったように"物の(genuine)"や"公式な(official)"といった意味がありますが、数学の"正規"はちょっと違います。 数学で"正規"(および"正則"、英語では"regular"または"non-singular")は、ある概念に強い制限をかけたもの、という意味です。強い制限をかけたものは取

    正規表現の"正規"とは何か気になったら正規表現の歴史を紐解くことになってしまった話
  • [C#]正規表現で、ルールに一致した文字列かどうか調べる/一致した文字列を抜き出す - Qiita

    やりたいこと 特定のルールに合致した文字列であるかどうかを確認したい。 また、ルールに合致した文字列を抜き出したい。 やり方 Regexクラスを使う。 サンプルコード using System; using System.Text.RegularExpressions; namespace ConsoleApp5 { class Program { static void Main(string[] args) { string org = "1dg4-fasd-kf5g-fsaa"; // ①4桁の英数字を-でつなげたものかどうかを判定 if (Regex.IsMatch(org, @"^[\da-zA-Z]{4}-[\da-zA-Z]{4}-[\da-zA-Z]{4}-[\da-zA-Z]{4}\z")) { Console.WriteLine("マッチしました!"); } // ②4

    [C#]正規表現で、ルールに一致した文字列かどうか調べる/一致した文字列を抜き出す - Qiita
  • C# 正規表現で真偽値を返す(IsMatchメソッド) | ITSakura

    public static bool IsMatch (string input, string 正規表現のパターン); 1つめの引数は、対象の文字列です。 2つめの引数は、正規表現のパターンです。 一致した場合はtrueを返し、一致しなかった場合falseを返します。 文字列を指定 using System; using System.Text.RegularExpressions; class Test1 { static void Main() { string a = "BC"; Console.WriteLine(Regex.IsMatch("ABC", a)); //True Console.WriteLine(Regex.IsMatch("ACB", a)); //False } } 8行目は、文字列「BC」を指定しています。 任意の1文字(.) string a = ".B