正则表达式:几个集团,行数可变

时间:2017-06-28 09:44:13

标签: regex

这是我的问题:我尝试提取2.0对应于集团/amountC/的{​​{1}}。一个集团总是有一个" amountC"但可能没有" amountA",B或D.

所以我需要解析:/id="two"/

(我已经有正则表达式来解析数字)

解析数据的例子:

[any nb of cars or \n] bloc id="two" [any nb of cars or \n] amountC

1 个答案:

答案 0 :(得分:0)

您没有描述使用正则表达式的上下文。如评论中所述,如果内容是JSON,您应该使用JSON解析器。不过,我会尝试回答你问的字面问题。

在大多数情况下,正则表达式在多个记录(也就是行)中都不能很好地工作。如果您从命令行运行,则可以使用awksed作为过滤器。假设内容位于名为"内容"的文件中。你可以使用以下内容:

<强> SED

sed -E '1,/bloc id="two"/ { /bloc id="two"/ ! d }
        /.*"amountC" :/ {
             s/.*"amountC" *: *([0-9\.]+).*$/\1/
             q
        }' <content
  1. 使用扩展的正则表达式支持调用sed。删除最多bloc id="two"的所有行(如果"amountC"出现在同一行上)。
  2. 现在,找一行containsjng "amountC"
  3. 删除数字前后的所有内容(此示例应更严格地解析有效数字)。
  4. 由于"amountC"已经发生,我们已经完成了;退出。
  5. 将内容直接发送到sed过滤器。
  6. <强> AWK

    awk 'BEGIN { Ignore=1 }
         /bloc id="two"/ { Ignore=0 }
         Ignore==1 { next }
         /"amountC"/ {
            print gensub(/.*"amountC" *: *([0-9\.]+).*/,"\\1")
            quit
         }
         // { next }' content
    
    1. 调用awk并初始化一个标志以忽略行。
    2. 如果发生bloc id="two",请开始寻找&#34; amountC&#34;。
    3. 忽略前导行(bloc id="two"之前)。
    4. 如果发生bloc id="two",请查找&#34; amountC&#34;。
    5. 如果找到目标行,则输出其数值。
    6. 目标已找到,所以我们已经完成了。
    7. (关闭区块)
    8. 如果不是目标行,请跳至下一行。