文字列の後の時間を見つける正規表現

文字列の後の時間を見つける正規表現

だから私はdwmblocksステータスバーのスクリプトを書こうとし、夕日と日の出時間をチェックする小さなモジュールを取得したいと思います。確かに、このウェブサイト私は同じことをするのに役立ちますが、カールファイルから日の出と日没の値を把握する方法がわかりません。

curl v2.wttr.in/nyc | grep (the values after 'Sunrise:  ' and 'Sunset:  ')

"sunrise:" と "sunset:" なしで値を返す正規表現を作成できますか?

答え1

オプションがgrepある場合。-P-o

$ curl -s v2.wttr.in/nyc | grep -Po 'Sun(rise|set):.*?\K\d+:\d+:\d+'
07:31:15
17:47:15

.*?digits:digits:digitsパターンが見つかるまで、できるだけ少ない数の文字をスキップしてください。スペースをスキップし、そこにあるカラーエスケープシーケンスもスキップします。\K出力の始まり(-oゲームの終わり)を示します。K

答え2

使用幸せ(以前のPerl_6)

raku -ne 'my @a = .split("|").map: *.trim; \
          .[2].put if .contains("Sunrise" | "Sunset") for @a.map: *.split( / \s+ /);'

または

raku -ne 'my @a = .split("|").map: *.trim; \
          .put for @a.grep(/ Sunrise | Sunset /).map: *.split(/ \s+ / ).[2];' 

curlOPが編集したページは非常に構造化された文書であるように見えるので、その属性を活用してください。上記のコード(両方の例)は行を取得し、|バーの別々の列に分割し、結果を配列(@a)に格納します。

最初の例:2番目のステートメントでは、要素はキー/値に配置され@aます。キー/値はwithで繰り返され、および/または文字列の場合は3番目(値)サブ要素のみが表示されます。split\s+for[2]containsSunriseSunset

@agrep2番目の例:orと一致する要素が見つかるまで配列要素を繰り返します。その後、すべてのped要素がキー/値に追加され、値(インデックス)が返されます。SunriseSunsetgrepsplit\s+[2]


上記のRakuの回答の利点は、「日の出」または「日没」に関連する値が何でも返すことができることです。たとえば、サイトが12時間制に切り替えられた場合は、AM/PM情報が再度受信されます。または@ StéphaneChazelasの優れた答えは、実際にはコロンで区切られた数字を選択します。 Rakuを使用すると、同様に「追加マイルを移動」し、comb3番目(値)サブ要素を渡すことで正しい数値パターンを得ることができます。

.comb(/ [\d**2] ** 3 % \: /)

Rakuの正規表現はcomb次のように解釈できます。3回繰り返し()とコロンで区切られた\d**2数字のペアに一致するコンテンツを見つけて返します。** 3%\:

一緒に入れてください:

raku -ne 'my @a = .split("|").map: *.trim; \
          .comb(/ [\d**2] ** 3 % \: /).put for @a.grep(/ Sunrise | Sunset /).map: *.split(/ \s+ / ).[2];'

または

raku -ne 'my @a = .split("|").map: *.trim; .[2].comb(/ [\d**2] ** 3 % \: /).put if .contains("Sunrise" | "Sunset") for @a.map: *.split( / \s+ /);'

上記の構造化された方法でテキストを分類すると、dd:dd:dd「日の出」または「日没」に関連する時間のみを取得できます。もちろん、上記の4つのコード例のすべてで、特定の要素を自由に自由に結合/削除できます。

出力例(上記の4つのコード例すべて):

07:31:15
17:47:15

https://rakudo.org
https://raku.org

関連情報