繁体   English   中英

我需要一个正则表达式来匹配木偶事实

[英]I need a regex to match puppet facter facts

木偶事实看起来像这样:

processors => {"models"=>["AMD Opteron(tm) Processor 6172", "AMD Opteron(tm) Processor 6172", "AMD Opteron(tm) Processor 6172", "AMD Opteron(tm) Processor 6172"], "count"=>4, "physicalcount"=>2}
productname => VMware Virtual Platform
ps => ps -ef
puppetversion => 3.6.2
rubysitedir => /usr/local/brs/harmony-puppet/lib/ruby/site_ruby/2.1.0
rubyversion => 2.1.2
sshecdsakey => AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNDUmg8FQGCO/r/VGABUPwBqT8zTwzXwZCjTdBC6cXj1Mo5ypxuqO1Qtwg9uQagcS5eLNbv+SxHotpzYSXZ1R8g=
sshfp_dsa => SSHFP 2 1 42ffbd293f1501c0718b2b7b3852542329da1758
SSHFP 2 2 eb52d78a34bdadecc41b38366a5580c923bbb6cd0b81cec76de6379ce4251439
sshfp_ecdsa => SSHFP 3 1 d41abd2e3aff846b4efb59dbc8e4803875d33130
SSHFP 3 2 ae77a20a66859976e06efb7d6dd0819db4f9e9d93bc55da52a4bffff6acb1baa
sshfp_rsa => SSHFP 1 1 d3f14587683138e6d10cacba92fa34364ed5d326
SSHFP 1 2 132856925e056d02767e6c6ca4015ed21ac4c6eddb727f7c69e5edecb8806884
sshrsakey => AAAAB3NzaC1yc2EAAAADAQABAAABAQDzcJ6158aIkY161vcDH6WKNgKAeUsxrHh+HJH9IEistcV2TUJSdHtG/p5peI+cTa0EhabbNw8ToUU3ZWYmiTmxxuZzxggAxCx6xhWNDgC/492QnouxHnqjxwpFyIYnLpdbaMRV/6t9iE7v09Gfb31TS3/DbAUh5yla1OOeHbxJQ/eUOUYgy7/6eFL43+R9SfiuP11VRK8r325mCOFaPqw8VuNeGul/rMnccBCbuFvgmQnfOo/ldwrfOL2W4qAvfE0bKyG13WrDSlauo+CFtYqDK08hCItjrbVKgVrOzLCuKGzKFuqOgF3u8Q1je23qu7eUmF7lZPYVWSEpkh0xlR0p
swapfree => 1.45 GB
swapfree_mb => 1482.82
swapsize => 1.46 GB
swapsize_mb => 1497.00
system_uptime => {"seconds"=>6034301, "hours"=>1676, "days"=>69, "uptime"=>"69 days"}
timezone => PDT

我试图轻松地将每个事实分成一个键/值对。 使用本网站:

http://rubular.com/

这个正则表达式

(?m)^(\S+) => (((?!^\S+ => ).)*)$

我能够得到我想要的东西(所有的键和值完全匹配)。 问题是我在java中编写代码并使用此站点:

http://java-regex-tester.appspot.com/

有了相同的输入,我没有得到我想要的比赛。 特别是键/值对的值包含换行符的事实,例如:

sshfp_rsa => SSHFP 1 1 d3f14587683138e6d10cacba92fa34364ed5d326
SSHFP 1 2 132856925e056d02767e6c6ca4015ed21ac4c6eddb727f7c69e5edecb8806884

最后省略值的第二行:

key = sshfp_rsa
value = SSHFP 1 1 d3f14587683138e6d10cacba92fa34364ed5d326

任何人都可以帮我建立正确的正则表达式吗?

这个正则表达式应该适合你:

(?ms)^(\w+) => (.*?)(?=(?:\s^\w+ =>|\z))

在Java代码中:

Pattern p = Pattern.compile("^(\\w+) => (.*?)(?=(?:\\s^\\w+ =>|\\z))", 
          Pattern.MULTILINE | Pattern.DOTALL);

RegEx演示

使用此表达式:

(?ms)^(\S+) => (.*?(?=^\S+ => |\Z))

演示


我保留了大部分相同的逻辑,除了寻找价值......让我们打破它:

.*?        (?# lazily match 0+ characters)
(?=        (?# begin lookahead to end value)
  ^\S+ =>  (?# find the start of a new key)
 |         (?# OR)
  \Z       (?# end of the string)
)          (?# end lookahead)

我们用点匹配换行符修饰符( s ),并做到这一点是通过在先行结束了慵懒的比赛。 前瞻是新键或字符串的结尾。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM