-1

如果在某个地方有答案,我深表歉意,但如果有的话,我的搜索技能会让我失望。

我正在使用 UltraEdit,我需要从一些 JSON 模式中删除一些行,以便更轻松地比较它们。

所以给出以下内容:

"PaymentMethod": {
               "$id": "/properties/PaymentMethod",
                "items": {
                    "$ref": "PaymentMethod.json"
                },
                "type": "array"
            }

使用这个正则表达式:

^.*\".*\"\: \".*$\r\n

选择这些行:

"$id": "/properties/PaymentMethod",
"$ref": "PaymentMethod.json"
"type": "array"

我需要做的是跳过 $ref 行。

我试图通过选择标准以各种方式使用 (?!json) 进行消极的环顾工作,但惨遭失败。

这样做的目的是删除选定的行。

谢谢你的帮助。

更新:为了澄清,我想删除与我的 Regex 找到的条件匹配的行,但我不想删除 $ref 行。所以我希望找到一种相对简单的方法来使用 UltraEdit 中的直接 perl 正则表达式来做到这一点。

我已经使用 Python 脚本创建了一个解决方法,因此我可以完成我的工作,但是找出是否有办法做到这一点仍然很有趣。:)

4

3 回答 3

1

不要编写自己损坏的解析器;使用现有的。

use Cpanel::JSON::XS qw( decode_json );

my $json_utf8      = '...';
my $data           = decode_json($json_utf8);
my $payment_method = $data->{PaymentMethod};
my $id             = $payment_method->{'$id'};
my $item           = $payment_method->{items}{'$ref'};
my $type           = $payment_method->{type};
于 2018-08-01T22:45:25.263 回答
0

如果您不想$ref在初始引号之后:

^.*\"(?!\$ref).*\"\: \".*$\r\n 

在这里看到它:https ://regex101.com/r/yxTwck/1

或根据.json"行尾排除:

^.*\".*\"\: \".*(?<!\.json")$\r\n

另请注意,您使用的是贪婪量词(.*vs. .*?)。如果您的想法是在 first 有第一.*",您可能应该使用[^\n"]*which 将防止 line feed 或"s 被消耗。例如,您的正则表达式匹配"""""""""""""" "type": "array"

于 2018-08-01T18:31:04.337 回答
0

使用 JSON 模块直接操作数据将是一种更强大的解决方案,但编辑 JSON 文件的一种快速而肮脏的方法是在命令行上运行它。

同样,这不是操作 JSON 的好方法,但它可能适合您的临时案例。

perl -ne 'print unless /"\$ref:"/' file.json > new_file.json
于 2018-08-01T18:31:56.960 回答