🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1838閲覧

正規表現で特定文字(含まない場合もあり)以前の文字だけキャプチャしたい

mohan

総合スコア13

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2021/02/02 05:20

編集2021/02/02 10:37

特定の文字列が入っている・入っていない場合もある文字列でのキャプチャ方法が分かりません。

対象文字列

下記のような文字列があります。
aaa bbb ccc at xxxx
ddd eee fff gggg

実現したいこと

正規表現を使って、下記のように取り出したいです(at以降の文字列をキャプチャしない)。
aaa bbb ccc
ddd eee fff gggg

試したこと

常にatがあるのであれば、

(.*?) at.*

等で取り出せるのですが、atが無い場合も取り出したい場合の記述方法が分かりません。

言語はrubyと書きましたが、正確にはfluentdの設定となっています(言語の命令は使えません)。

先読み、後読みを使うのかとも思ったのですが、使い方が分かりませんでした。
正規表現だけで取り出す方法はありますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2021/02/02 05:44

atはat単体のみかataのような先頭にヒットするのかkata的な一部でもヒットするかによります
mohan

2021/02/02 05:46

atは文字列 半角スペース at 半角スペース 文字列になっており、常に文字列の中間にあります(先頭、末尾には無い)。
yambejp

2021/02/02 05:49

atが半角スペースに囲まれているとして、atを含む文字が絶対に存在しない担保はないのですね?
mohan

2021/02/02 05:51

はい。" at "を含む文字がない場合もあります。
yambejp

2021/02/02 05:52

いやそうではなく、ataとかkataとかが絶対に含まれない保証がないですか?という質問です
mohan

2021/02/02 05:55

残念ながらataやkataは含まれる可能性はあります。システムログをこの正規表現を使って必要なものだけ収集しようとしています。ある意味自由文なので、どの文字列が来るかは分かりません。
KojiDoi

2021/02/02 08:14

fluentdでの使い方を知りたいのならfluentdタグをつけてください。そして、rubyはタグとして不適切なので外してください。
mohan

2021/02/02 10:42

fluentdはrubyで作られており、今回分からなかった部分はfluentdの設定と言うよりはrubyの正規表現部分だったためこのタグを付けましたが、外しました。
guest

回答2

0

単純に、「atもしくは末尾」とすればいいのではないでしょうか?

/\A(.*)(?:at|\z)/

投稿2021/02/02 05:26

maisumakun

総合スコア145967

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mohan

2021/02/02 06:48 編集

"aaa bbb ccc at xxxx 改行"では上手くいく(aaa bbb ccc)のですが、"aaa bbb ccc at xxxx"では"aaa bbb ccc at xxxx"なってしまいます。 また、"aaa bbb ccc xxxx"では上手くいく(aaa bbb ccc xxxx)のですが、"aaa bbb ccc xxxx 改行"ではmatchなしになってしまいます。 せめて、両方改行あり・両方改行なしのどちらかが上手く行けばと思っているのですが、どこが悪いのでしょうか。 実際使用する文字列は長いため、上記の文字列を下記に入れ試しています。 https://rubular.com/
yambejp

2021/02/02 06:54 編集

改行を含む場合 「aaa bbb\nccc at ddd」 がマッチするのは 「aaa bbb\nccc」 なのでしょうか?それとも 「aaa bbb」と「ccc」 なのでしょうか?
mohan

2021/02/02 08:55

ありがとうございます。 (.*?)(?:at.*|\z) でこちらが想定している動きになりました。 ?:の部分の使い方が勉強になりました。ありがとうございました。
guest

0

ベストアンサー

fluentdの仕様は良く知らないですけど、perlで試した限りでは以下でうまくいきそうな気がします。

/(.*?)(?: at .*|$)/

投稿2021/02/02 08:17

KojiDoi

総合スコア13692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mohan

2021/02/02 08:57

/(.*?)(?: at .*|$)/ や /(.*?)(?:\sat\s.*|\z)/ で、こちらの想定している動きになりました。 ありがとうございました!
yambejp

2021/02/02 09:07

\sは空白文字なのでタブなどでも反応してしまうため命題とことなると思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問