在perl中为字符串创建通用正则表达式

时间:2018-07-02 15:13:48

标签: perl

我尝试为以下内容创建正则表达式:

STRING sou_u02_mlpv0747_CCF_ASB001_LU_FW_ALERT|/opt/app/medvhs/mvs/applications/cm_vm5/fwhome/UnifiedLogging|UL_\d{8}_CCF_ASB001_LU_sou_u02_mlpv0747_Primary.log.csv|FATAL|red|1h||fw_alert

REGEX----> /^[^#]\w+\|[^\|]+\|\w+\|\w+\|\w*\|\w*\|([^\|]+|)\|\w*$/

我无法在这里找出错误。

我通过引用另一个可以正常工作的正则表达式创建了上面的代码,

/^[^#]\w+\|[^\|]+\|([^\|]+|)\|[rm]\|(in|out|old|new|arch|missing)\|\w+\|([0-9-,]+|)\|\w*\|\w*$/

sou_u02_mlpv0747_CCF_ASB001_LU_ODR|/opt/app/medvhs/mvs/applications/cm_vm5/components/CCF_ASB001_LU/SPOOL/ODR||r|out|30m|0400-1959|30m|gprs_in_stag

有人可以帮帮我吗。任何线索都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

让我们从简要看一下源文本(包括的第一个文本)开始。

它由用|字符分隔的“部分”组成。

此字符(|)必须与\|匹配。记住前面的内容 反斜杠,否则,“裸” |表示替代分隔符 (您曾在一个地方使用它)。

现在看一下每个部分(在|之间):

  • 其中一些仅包含 word字符的序列(并且可以匹配 由\w+)。
  • 但是,
  • 其他部分还包含其他字符,例如斜线, 反斜杠,花括号和点,因此每个这样的部分实际上都是一个序列 除“ |” 以外的个字符,并且必须与[^|]+匹配(此处, 在[]之间,竖线可能未转义)。

现在让我们编写每个节及其“类型”:

  1. sou_u02_..._FW_ALERT-单词字符。
  2. /opt/app/.../UnifiedLogging-其他字符(由于斜杠)。
  3. UL_\d{8}_..._Primary.log.csv-其他字符(由于\d{8}  和点)。
  4. FATAL|red|1h-由单词char组成的3个部分。
  5. 部分,在两个连续的|字符之间。
  6. fw_alert-单词字符。

现在,如何匹配这些组以及分隔的|

  • 第1点:\w+\|-字符和竖线(转义)。
  • 第2点和第3点(共同):(?:[^|]+\|){2}-不可捕获 组-(?:...),包含一系列“其他”字符-[^|]+ 和竖线-\|,发生两次{2}
  • 第4点(三个“单词字符”组):(?:\w+\|){3}-与 上一点。
  • 第5点:就像您的解决方案一样-([^|]+|)\|,一个捕获小组- (...),有2个替代选择...|...。第一种选择是 [^|]+(一系列“其他”字符)和第二个替代项 是空的。捕获组之后有\|以匹配垂直 酒吧。
  • 要点6:\w+-字字符。这次没有\|,因为这是最后一次 部分。

到目前为止组装的正则表达式必须为:

  • ^(字符串的开头)和
  • 为前缀
  • 附加了$(字符串的结尾)。

因此,与您的源文本匹配的整个正则表达式可以是:

^\w+\|(?:[^|]+\|){2}(?:\w+\|){3}([^|]+|)\|\w+$

实际上,唯一的捕获组可以用其他方式编写, 为([^|]*)-没有替代方案,但以*作为 重复计数,也允许空内容。 您的选择,要应用的变体。

答案 1 :(得分:0)

第三场

UL_\d{8}_CCF_ASB001_LU_sou_u02_mlpv0747_Primary.log.csv

包含反斜杠\,大括号{ }和点.\w

不能匹配这些项

还请注意,无需在字符类内对管道|进行转义:[^|]+很好