【问题标题】:Matching numbers with non-digits embedded匹配嵌入非数字的数字
【发布时间】:2016-09-14 18:47:25
【问题描述】:

我正在尝试匹配其中包含非数字的数字字符串。使用http://regexr.com/ 中的默认文本,应匹配以下内容:

v2.1
-98.7
3.141
.6180
9,000 
+42
555.123.4567    
+1-(800)-555-2468

以下内容应该匹配:

0123456789
12345

我试过了:

/[^\n\ ]{1,}\d+\S+\d/g

但它不会匹配+42 并且它错误地匹配012345678912345,并将"555.123.4567 +1-(800)-555-2468" 视为一个字符串。

我试图通过在末尾添加一个$ 来缓解它,但没有任何匹配。不知道我做错了什么。

【问题讨论】:

    标签: regex perl grep


    【解决方案1】:

    您可以使用此正则表达式匹配任何文本,其中至少包含一个非数字:

    /^\d*[^\d\n]+\d.*$/mg
    

    RegEx Demo

    RegEx 拆分:

    • ^ - 开始
    • \d* - 匹配 0 个或多个数字
    • [^\d\n]+ - 匹配 1 个或多个非数字且非换行符的任何字符
    • \d - 匹配一个数字
    • .* - 匹配 0 个或多个任意字符
    • $ - 结束

    【讨论】:

    • 我应该评论说它也匹配非数字字符串。就像一个句子。
    • 标题是匹配非数字嵌入的数字。所以我认为提议的正则表达式不应该匹配没有数字的行。你的匹配test
    • 是的,但它似乎是一种混合物。
    • 这行得通。从命令行获取它需要一些按摩,但它可以工作。
    【解决方案2】:

    试试这个:

    ^(?=.*\d)(?=.*[^\d\s])\S+$
    

    这意味着“至少一个数字和一个非数字且没有空格”。

    live demo


    如果您的输入中没有换行符,您可以使用稍微简单的:

    ^(?=.*\d)(?=.*\D)\S+$
    

    【讨论】:

    • 您的第一个正则表达式匹配纯数字字符串,但第二个没问题。
    • @revo 如果没有换行符,第一个有效 - 请参阅 live demo
    • 仅当没有新行时。你可以避免它^(?=.*\d)(?=.*\D(?!^))\S+$
    • @revo 我刚刚重新阅读了 Q,并且输入有换行符......答案相应更新。谢谢
    【解决方案3】:

    你是不是想太多了?使用/\D/ 匹配包含非数字的字符串有什么问题?

    我不确定您的确切要求是什么,但如果您正在寻找包含至少一个数字和至少一个非数字的字符串,那么最简单的方法是使用正则表达式匹配 - @987654322 @。

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    use 5.010;
    
    while (<DATA>) {
      chomp;
      say "$_: " . (/\d/ && /\D/ ? 'matches' : 'doesn\'t match');
    }
    
    __DATA__
    v2.1
    -98.7
    3.141
    .6180
    9,000
    +42
    555.123.4567
    +1-(800)-555-2468
    0123456789
    12345
    

    【讨论】:

      【解决方案4】:

      看起来您想避开完全由数字或完全由字母组成的字符串。所以你可以排除那些。这也将允许输入没有 any 数字的字符串,因此也需要一个数字。

      my $exclude = qr/(?: [0-9]+ | [A-Za-z]+ )/x;
      my @res = grep { not /^$exclude$/ and /\d/ } @strings;
      

      如果需要排除任何其他字符(下划线?),请将其添加到列表中。

      不清楚你的输入是如何来的,这需要一个准备好的字符串列表。根据输入添加字边界和/或/s。或者为此将输入解析为字符串列表。


      如果输入是多行字符串,my @strings = split '\n|\s+', $text;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-30
        • 2017-10-20
        • 2012-06-15
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多