【问题标题】:Regex to match string until first occurrence of decimal point followed by a tab正则表达式匹配字符串,直到第一次出现小数点后跟一个制表符
【发布时间】:2018-07-16 01:38:41
【问题描述】:

我正在寻找一个正则表达式来实现以下目标:从一个列表中,我只想要在第一次出现小数点后有一个制表符的所有字符串。这些字符串只能位于每行的开头。使用我当前的正则表达式 /^(\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 个小数点的字符串。

谢谢!

【问题讨论】:

  • 您的示例文本中当然没有制表符。但如果有,(?m)^[^\s.]*\.(?=\t) 或者你可以使用其他一些垃圾

标签: php regex


【解决方案1】:

你可以使用

'~^[^.\r\n]+\.(?=\t)~m'

请参阅regex demo注意:如果将行作为单独的字符串传递,则不需要 \r\nm 修饰符。

详情

  • ^ - 行首(m 修饰符使 ^ 匹配行首位置)
  • [^.\r\n]+ - 除.、LF 和 CR 之外的 1+ 个字符
  • \. - 一个点
  • (?=\t) - 在. 之后必须有一个标签。

PHP demo:

if (preg_match_all('~^[^.\r\n]+\.(?=\t)~m', $str, $m)) {
    print_r($m[0]);
}

输出:

Array
(
    [0] => aaa.
    [1] => abarth.
    [2] => ai.
    [3] => xn--ngbc5azd.
)

【讨论】:

    【解决方案2】:

    迟到的答案,但您也可以使用:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 2011-01-02
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多