golang中的正则表达式换行符和空格

时间:2017-04-30 12:24:48

标签: regex go re2

我试图将下面的字符串与正则表达式匹配,并从中获取一些值。

/system1/sensor37
  Targets
  Properties
    DeviceID=37-Fuse 
    ElementName=Power Supply
    OperationalStatus=Ok
    RateUnits=Celsius
    CurrentReading=49
    SensorType=Temperature
    HealthState=Ok
    oemhp_CautionValue=100
    oemhp_CriticalValue=Not Applicable

使用下面的正则表达式

`/system1/sensor\d\d\n.*\n.*\n\s*DeviceID=(?P<sensor>.*)\n.*\n.*\n.*\n\s*CurrentReading=(?P<reading>\d*)\n\s*SensorType=Temperature\n\s*HealthState=(?P<health>.*)\n`

现在我的问题是:有更好的方法吗? 我明确提到了字符串中的每个新行和空格组。但我可以只说/system.sensor\d\d.*DeviceID=(?P<sensor>.*)\n*.(它对我没用,但我相信应该有办法解决它。)

2 个答案:

答案 0 :(得分:9)

默认情况下,.与换行符不匹配。要更改它,请使用s标志:

(?s)/system.sensor\d\d.*DeviceID=(?P<sensor>.*)

来自:RE2 regular expression syntax reference

  

(?flags)在当前组中设置标志;非捕获
  s - 让.匹配\n(默认为false)

答案 1 :(得分:3)

如果您希望以较短的方式使用正则表达式获取这些属性,您首先要使用(?s) [含义&amp;在Kobi的回答中使用]。对于每个属性,请使用以下语法:
.*ExampleProperty=(?P<example>[^\n]*).*

  

.* - &#34;忽略&#34;所有文字都在开头结尾(匹配,但不会捕获);   
ExampleProperty= - 停止&#34;忽略&#34;文本;   
(?P<example>...) - 命名捕获组;   
[^\n*] - 匹配属性中的值,直到找到换行符。

因此,这是与您的文本匹配并获得所有这些属性的短正则表达式:

(?s)\/system.\/sensor\d\d.+DeviceID=(?P<sensor>[^\n]*).*CurrentReading=(?P<reading>[^\n]*).*SensorType=(?P<type>[^\n]*).*HealthState=(?P<health>[^\n]*).*

<sensor> = 37-Fuse 
<reading> = 49
<type> = Temperature
<health> = Ok

[DEMO] https://regex101.com/r/Awgqpk/1