正则表达式将在字符串后查找时间

正则表达式将在字符串后查找时间

因此,我正在尝试为我的 dwmblocks 状态栏编写一个脚本,并且想要获得一个小模块来检查日落和日出时间。显然,这个网站可以帮助我做同样的事情,但我不知道如何从卷曲文件中 grep 出日出和日落值。

curl v2.wttr.in/nyc | grep (the values after 'Sunrise:  ' and '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) 中。

第一个例子:在第二条语句中, 的元素@asplit放入\s+键/值中。这些键/值通过 with 进行迭代for,并且如果是 and/or 字符串,则仅显示第三个[2](值)子元素。containsSunriseSunset

@a第二个示例:遍历数组元素,直到找到与orgrep匹配的元素。然后,所有ped 元素都会被放入键/值中,并返回值(索引)。SunriseSunsetgrepsplit\s+[2]


上面的 Raku 答案的优点是您可以返回与“日出”或“日落”相关的值,无论它们是什么。例如,如果站点切换到 12 小时时钟,您将收到AM/PM返回的信息。或者,@StéphaneChazelas 的出色答案实际上选择了以冒号分隔的数字。使用 Raku,您可以类似地“加倍努力”并comb通过第三个(值)子元素来获得正确的数字模式:

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

Raku 中的正则表达式comb可以解读如下:查找并返回与\d**2数字对匹配的内容,重复** 33 次,内部用 ( %)分隔\:用冒号

把它们放在一起:

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

相关内容