正则表达式:仅匹配数字所在的行

时间:2018-10-01 21:58:26

标签: regex perl numbers

真的很讨厌这个正则表达式。这么多组合...。我相信我需要另一个大脑:-)

这是我的问题,如果有人帮助,我将不胜感激。

我有这6行JSON响应

...some JSON code here

    "note" : "",
    "note" : "Here is my note",
    "note" : "My note $%$",
    "note" : "Created bug 14569 in the system",
    "note" : "Another beautiful note",
    "note" : "@#$%#@%dgdeg"

...continuation of the JSON code

在正则表达式的帮助下,如何仅匹配数字 14569

我尝试过此正则表达式,但它匹配所有6行

"note"([\s\:\"a-zA-Z])*([0-9]*) - 6 matches (I only need one) 
"note"([\s\:\"a-zA-Z])*(^[0-9]*) - no matches
"note"([\s\:\"a-zA-Z])*([0-9]*+?) - pattern error
"note"([\s\:\"a-zA-Z])*(^[0-9]*+#?) - no match 

感谢您的帮助!

已为Matt更新。下面是我完整的JSON对象

"response": {
        "notes": [{
    "note" : "",
    "note" : "Here is my note",
    "note" : "My note $%$",
    "note" : "Created bug 14569 in the system",
    "note" : "Another beautiful note",
    "note" : "@#$%#@%dgdeg"
        }]
    } 

4 个答案:

答案 0 :(得分:1)

您可以尝试此正则表达式:

"note"\s*:\s*".*?([0-9]++).*"

它将为您提供比赛第1组中的号码。

如果您不想匹配单词中的数字(例如“ bug11”),请使用单词边界断言(\b)将捕获组括起来:

"note"\s*:\s*".*?\b([0-9]++)\b.*"

Regex101 demo

答案 1 :(得分:1)

如果您只关心行中包含数字,那么这就是您需要查找的全部内容。

/[0-9]/ # matches if the string includes a digit

或者,您要捕获数字:

/([0-9]+)/ # matches (and captures) one or more digits

这是初学者构建正则表达式时常见的错误。他们想构建一个匹配整个字符串的正则表达式-实际上,他们只需要匹配他们想匹配的字符串的一部分即可。

更新

这可能有助于解释为什么其他一些尝试失败了。

"note"([\s\:\"a-zA-Z])*([0-9]*) - 6 matches (I only need one) 

*的意思是“匹配上一个项目的零个或多个”,有效地使该项目成为可选项目。这会匹配所有包含零个或多个数字的行。

"note"([\s\:\"a-zA-Z])*(^[0-9]*) - no matches

^的意思是“下一项必须在字符串的开头”。您的字符串开头没有数字。

"note"([\s\:\"a-zA-Z])*([0-9]*+?) - pattern error

是的。您只是在这里添加随机标点,不是吗? *+?对正则表达式解析器毫无意义。

"note"([\s\:\"a-zA-Z])*(^[0-9]*+#?) - no match 

由于与上一次使用^的尝试相同的原因而失败-数字不在字符串的开头。另外,#在正则表达式中没有特殊含义,因此#?的意思是“零个或一个#个字符”。

答案 2 :(得分:0)

如果您有JSON,为什么不解析JSON,然后对结果进行grep?

use JSON 'decode_json';
my $data = decode_json( $json_text );
my @rows = map { /\b(\d+)\b/ ? $1 : () } # keep only the number
           map { $_->{note} } @$data;

答案 3 :(得分:0)

这可能有效(?m-s)^[^"\r\n]*?"note"\h*:\h*"[^"\r\n]*?\d+[^"\r\n]*".*

https://regex101.com/r/ujDBa9/1

解释

 (?m-s)                        # Multi-line, no dot-all
 ^                             # BOL
 [^"\r\n]*?                    # Not a double quote yet
 "note" \h* : \h*              # Finally, a note
 " [^"\r\n]*? \d+ [^"\r\n]* "  # Is a number embedded within the quotes ?
 .*                            # Ok, get the rest of the line