【问题标题】:Regex newline and whitespace in golanggolang中的正则表达式换行符和空格
【发布时间】:2017-09-28 02:44:10
【问题描述】:

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

/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&lt;sensor&gt;.*)\n*.吗(它对我不起作用,但我相信应该有办法。)

【问题讨论】:

    标签: regex go re2


    【解决方案1】:

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

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

    发件人:RE2 regular expression syntax reference

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

    【讨论】:

      【解决方案2】:

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

      .* - “忽略”开始结束的所有文本(匹配,但不捕获);
      ExampleProperty= - 停止“忽略”文本;
      (?P&lt;example&gt;...) - 命名捕获组;
      [^\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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-20
        • 2020-09-12
        • 1970-01-01
        • 2019-06-21
        相关资源
        最近更新 更多