簡體   English   中英

PCRE字符類減法

[英]PCRE character class subtraction

我有一些條目的數據流。

  • 條目包含1個必填字段和1個可選字段。
  • 字段用分號隔開;
  • 字段包含除SEMICOLON之外的任何可打印符號;
  • 必填字段的長度應為1-60個符號。
  • 可選字段的長度可以是0-60個符號。

我想匹配條目中的所有字段。 我使用否定的超前斷言從[:print:] POSIX字符類中減去分號,但似乎不適用於長度受限制的字段。

我的資料:

[1427894078] SERV;ICE ALERT: example.com ;Current Load;CRITICAL;SOFT;3;CRITICAL - load average: 1.96, 1.29, 0.59

我的正則表達式(PCRE):

((?!;)[[:print:]]{1,60});((?!;)[[:print:]]{0,60})

我期望得到什么:

Match 1:
Group 1: [1427894078] SERV
Group 2: ICE ALERT: example.com 

Match 2:
Group 1: Current Load
Group 2: CRITICAL

Match 3:
Group 1: SOFT
Group 2: 3

我錯誤地得到了什么:

Match 1:
Group 1: [1427894078] SERV;ICE ALERT: example.com ;Current Load
Group 2: CRITICAL;SOFT;3;CRITICAL - load average: 1.96, 1.29, 0.59

演示: https : //regex101.com/r/3uObB5/2

你真親密 正則表達式的唯一問題是您沒有在量化集群中包括超前行為:

  • (?!;)[[:print:]]{1,60}應該是(?:(?!;)[[:print:]]){1,60}

現在,它可以匹配正確的字符塊(請參見此處的實時演示):

((?:(?!;)[[:print:]]){1,60});((?:(?!;)[[:print:]]){0,60})

但是,還有更好的選擇(請參見此處的現場演示):

([^\p{C};]{1,60});([^\p{C};]{0,60})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM