4

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

/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*.(它对我不起作用,但我相信应该有办法。)

4

2 回答 2

15

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

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

来自:RE2正则表达式语法参考

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

于 2017-04-30T12:44:37.853 回答
3

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

.*- “忽略”开头结尾的所有文本(匹配,但不捕获);
ExampleProperty=- 停止“忽略”文本;
(?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

[演示]https ://regex101.com/r/Awgqpk/1

于 2017-04-30T14:22:46.840 回答