用正则表达式解析ssh-config文件

时间:2014-09-23 06:37:03

标签: regex groovy

我很难用正则表达式解析ssh-config格式的文件

我希望获取文件中的每个配置组,例如,如果要解析的字符串是这样的:

Host myserver
 HostName somedns1
 User abcuser
 IdentityFile ~/.ssh/id_rsa
Host myserver2
 HostName someotherdns2
 User yourmum
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/id_yourmum_rsa
Other sdofmwerf
 something some
 haha ha
Host myserver3
 HostName someotherdns23
 PreferredAuthentications publickey
 User root
 IdentityFile ~/.ssh/deploy.key
Host myserver4
 HostName someotherdns532
 PrefferedAuthentications publickey
 User root
 IdentityFile ~/.ssh/deploy.key

我希望每个小组都以Word开头,前面没有空格,一直到下一组之前。这是一个这样的群体的一个例子:

Other sdofmwerf
 something some
 haha ha

我尝试了各种前瞻/后方技术和捕获组,但我对此相当陌生并浪费了几个小时试图实现它。如果这是一个简单的案例,我很抱歉。

编辑:我正在使用 java Groovy 2.3.6

感谢您的时间!

3 个答案:

答案 0 :(得分:2)

看看给出的答案,我决定与我分享。

/(?<=^)(\S.*?)(?=^\S|\Z)/sm

较短且缺少\n的问题。

部分是:

  • 字符串开头的正面观察
  • 要在单独文件中写入的内容
  • 以非空格或输入结尾
  • 开头的字符串的正向前瞻

答案 1 :(得分:1)

您可以使用此正则表达式分别捕获每个块:

^(\w[\s\S]*?\w)$(?=(?:\s^\w|\s*\z))
  • 将其与标记m(MULTILINE)
  • 一起使用

RegEx Demo

您需要在Matcher#find() while循环中使用此正则表达式来获取每个块。

答案 2 :(得分:1)

(^(?!\s).*?\n(?:\s.*?(?:\n|$))*)

试试这个。请确保设置正确的标志。参见演示。

http://regex101.com/r/lS5tT3/6