我正在寻找一个正则表达式来实现以下功能:从列表中,我只想要所有在第一次出现小数点后有制表符的字符串。这些字符串只能位于每行的开头。使用我当前的正则表达式/^(S+.)/gm
,我甚至得到了具有2个或更多小数点的字符串。
以下是一些示例代码(空格实际上是选项卡(:
aaa. 86400
ns1.dns.nic.aaa. 172800 IN A 156.154.144.2
ns1.dns.nic.aaa. 172800 IN AAAA 2610:a1:1071:0:0:0:0:2
abarth. 86400 IN RRSIG NSEC 8 1 86400 20180728050000 20180715040000 41656 .
a0.nic.abarth. 172800 IN A 65.22.24.17
a0.nic.abarth. 172800 IN AAAA 2a01:8840:1a:0:0:0:0:17
ai.
ns2.offshore.ai. 172800 IN A 108.166.113.245
whois.ai. 172800 IN A 209.59.119.1
xn--node.ns.anycast.pch.net. 172800 IN A 204.61.216.88
d.nic.xn--mxtq1m. 172800 IN AAAA 2001:c50:ffff:1:0:0:0:185
d.nic.
xn--ngbc5azd. 172800 IN NS a.nic.xn--ngbc5azd.
我需要的是aaa.
、abarth.
、ai.
和xn--ngbc5azd.
,而不是a0.nic.abarth.
或whois.ai
或任何其他小数点超过1的字符串。
谢谢!
您可以使用
'~^[^.rn]+.(?=t)~m'
请参阅regex演示注意:如果将行作为单独的字符串传递,则不需要rn
和m
修饰符(。
详细信息
^
-行首(因为m
修饰符使^
与行首位置匹配([^.rn]+
-1+除.
、LF和CR之外的字符.
-一个点(?=t)
-.
后面必须有一个选项卡
PHP演示:
if (preg_match_all('~^[^.rn]+.(?=t)~m', $str, $m)) {
print_r($m[0]);
}
输出:
Array
(
[0] => aaa.
[1] => abarth.
[2] => ai.
[3] => xn--ngbc5azd.
)
延迟回答,但您也可以使用:
preg_match_all( '/^([^.]+.)t/m', $x, $m, PREG_PATTERN_ORDER );
print_r( $m[1] );
Array
(
[0] => aaa.
[1] => abarth.
[2] => ai.
[3] => xn--ngbc5azd.
)
Regex101
Ideone