我试图将下面的字符串与正则表达式匹配,并从中获取一些值。
/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*.
(它对我没用,但我相信应该有办法解决它。)
答案 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