正则表达式 - 命名组按模式进行多次匹配

Regex - named groups multiple match by patterns

下面是一个字符串模式,我想从中提取一些信息用于分析系统。 PRMS: {"load_numbers"=>"12345678", "shipper"=>"some-shipper", "app_id"=>"my_app_id", "timestamp"=>"20220502081520", "action"=>"index", "referencenumbers"=>["12342", "22342", "32323"]}

我想提取 app_idreferencenumbersshipper 的值(=> & 引号之间的值)。我写了一个名为 REGEX101 来提取它们:

(?<loadnumbers>\"load_numbers\"=>\"*\"(.*?)\")|(?<appid>\"app_id\"=>\"([^\s]+)\")|(?<shipper>\"shipper\"=>\"(.*?)\")|(?<referenceNumbers>\"referenceNumbers\"|\"ReferenceNumbers\"=>\[(.*?)\])|(?<carrier>\"carrierName\"=>\"(.*?)\")|(?<trackingid>\"tracking_id|\"trackingid\"=>\"(.*?)\")

但是,这些值将进入带有键的命名组,并且这些值会移动到下一个组。请注意,并非所有值都在给定字符串中,仅提取可用的值。大多数情况下,值的出现顺序是相同的。我该如何解决这个问题?

您需要将组名放在实际捕获值的位置,例如:

(?:\"load_numbers\"=>\"*\"(?<loadnumbers>[^\"]*)\")

您的完整正则表达式(经过一些简化和优化)然后变为:

(?:\"load_numbers\"=>\"*\"(?<loadnumbers>[^\"]*)\")|
(?:\"app_?id\"=>\"(?<appid>\S+)\")|
(?:\"shipper\"=>\"(?<shipper>[^\"]*)\")|
(?:\"[Rr]eference[nN]umbers\"=>\[(?<referenceNumbers>[^]]*)\])|
(?:\"carrierName\"=>\"(?<carrier>[^\"]*)\")|
(?:\"tracking_?id\"=>\"(?<trackingid>[^\"]*)\")

Demo on regex101