真的很讨厌这个正则表达式。这么多组合...。我相信我需要另一个大脑:-)
这是我的问题,如果有人帮助,我将不胜感激。
我有这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"
}]
}
答案 0 :(得分:1)
您可以尝试此正则表达式:
"note"\s*:\s*".*?([0-9]++).*"
它将为您提供比赛第1组中的号码。
如果您不想匹配单词中的数字(例如“ bug11”),请使用单词边界断言(\b
)将捕获组括起来:
"note"\s*:\s*".*?\b([0-9]++)\b.*"
答案 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