正規表現で決まった文字列を検索・抽出するのはそんなに難しくないが、文字列が表示されるパターンは決まっていても、アルファベットや数字、日本語など、どのような文字列が入るかわからない場合に抽出する方法をご紹介します!
今回はJavaScriptでの例ですが、PHPや他の言語でも活用できます。
起点となる文字列の検索
まず、例題となる文字列はこちらです。
1 |
var str = 'YYYYMMDDhhmmss Error: hogehoge, ServerName'; |
文字列の中には必ず[Error]という文字があり、その後にある[hogehoge]の部分が抽出したい可変の文字列があったとします。
そこで、まずは文字列の中に[Error]が含まれるかを検索します。
ここは決まった文字列なので、正規表現でなくても構いません。
今回は、以下を参考に2つの検索方法だけご紹介しておきます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUUzJTgwJTkwSmF2YVNjcmlwdCVFMyU4MCU5MSVFRiVCRCU5RSVFMyU4MiU5MiVFNSU5MCVBQiVFMyU4MiU4MCVFMyU4MSU4QiVFMyU4MSVBRSVFMyU4MyU4MSVFMyU4MiVBNyVFMyU4MyU4MyVFMyU4MiVBRiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9N2ViYTI4MmYxMzRjZGMwY2EzZDZiZTE1ZTc2MDdkZGM&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBrYXp1NTYmdHh0LWNvbG9yPSUyMzIxMjEyMSZ0eHQtZm9udD1IaXJhZ2lubyUyMFNhbnMlMjBXNiZ0eHQtc2l6ZT0zNiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZzPWEzNWMxNWFmNWFmNmVjZjg4Y2FjMzBmZjcxM2UxMDg4&blend-x=142&blend-y=486&blend-mode=normal&s=a8d7fe14290b5b1ca61a4d995188da49)
1. [indexOf]で検索する
[indexOf]は検索して文字列が見つかった最初の場所(先頭は0)を数値で返します。
見つからなければ「-1」を返すので、これを利用して以下のように検索します。
1 2 3 |
if (str.indexOf('Error') !== -1) { ・・・ } |
ビット反転演算子を使えば、もっとシンプルに記述できます。
1 2 3 |
if (~str.indexOf('Error')) { ・・・ } |
2. [match]の正規表現で検索する
次は、今回のお題でもある文字列を抽出する際にも使用する[match]を利用した正規表現で検索します。
[match]は検索して文字列が見つかれば配列で返し、見つからなければnullを返します。
1 2 3 |
if (str.match('/Error/')) { ・・・ } |
これで、文字列の中に[Error]が含まれているのが確認できましたので、その後ろにある不特定の文字列を抽出したいと思います。
不特定の文字列を抽出する
それでは、以下の参考サイトを例に文字列に[Error]が含まれているのを確認しましたので、後ろの[hogehoge]のみを抽出してみましょう。
![](https://www.koikikukan.com/images/2013/04/20130402_javascript_1.png)
検索でも利用した[match]と、正規表現のグループ化を使います。
おさらいですが、[match]は検索で見つかった文字列を配列で返します。
そこで、検索結果を変数に入れて出力してみましょう。
[Error]を起点にしないと何処に[hogehoge]があるかわからないので、このようになりますよね?
1 |
var result = str.match('/Error: .*,/'); |
こちらは「Error: 」の後に「.*」何らかの文字列があり「,」で終わる箇所を抽出しています。
しかし、これをそのまま[result]の結果を出力すると、
1 |
Error: hogehoge, |
と表示されてしまいます。
[Error]は抽出したい文字列の場所を示すために必要だけれど、出力するのは「hogehoge」だけにしたい!
そんな時に、正規表現のグループ化を利用して[match]の結果を配列に入れてあげましょう。
方法は簡単で、正規表現の中で抽出したい文字列の部分を括弧()で囲んであげます。
1 |
var result = str.match('/Error: (.*),/'); |
こちらの出力結果は以下のようになります。
1 2 |
result[0] → Error: hogehoge, result[1] → hogehoge |
これで配列の[1]だけを返せば[hogehoge]が抽出できますね!
この方法を使えば、[Error]の後に例えどんな文字列が入ってきても抽出できます。
1 2 3 4 |
var str = 'YYYYMMDDhhmmss Error: azAZ09あんアン安, ServerName'; if (~str.indexOf('Error')) { var result = str.match('/Error: (.*),/'); } |
結果はもちろんこのようになります。
1 2 |
result[0] → Error: azAZ09あんアン安, result[1] → azAZ09あんアン安 |
正規表現とグループ化の応用
最後に、例題の日時(YYYYMMDDhhmmss)やサーバー名(ServerName)も[match]の配列として取得してみましょう!
1 2 |
var str = '20220222222222 Error: fugafuga, ServerName'; var result = str.match('/^([0-9]{14}) Error: (.*), (.*)$/'); |
こちらの正規表現では3つグループ化していますね。
結果はこのようになります。
1 2 3 4 |
result[0] → 20220222222222 Error: fugafuga, ServerName result[1] → 20220222222222 result[2] → fugafuga result[3] → ServerName |
もう分かりましたね!
以上、正規表現のグループ化を用いた文字列の抽出方法でした!
コメント