1

我正在匹配以下字符串:

  • 水印=测试
  • 水印=文本测试|位置-24-50
  • 水印=文本测试|position-24-50|color-6aa6cc
  • 水印=文本测试|position-24-50|color-6aa6cc|size-48

使用以下正则表达式:

watermark=(text-\w+\|position-\d+-\d+\|color-([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})\|size-\d+|text-\w+\|position-\d+-\d+\|color-([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})|text-\w+\|position-\d+-\d+|\w+)

它有效,但它太丑了,让我想用热棒戳我的眼睛。你们中的任何一个正则表达式大师都愿意通过对您的方法的简要解释来重构它吗?

4

3 回答 3

1
\bwatermark=(?:text-|)\w+(?:\|position-\d+-\d+(?:\|color-[0-9a-fA-F]+(?:\|size-\d+|)|)|)\b
于 2012-06-29T14:59:35.120 回答
1
watermark=(text-\w+\|position-\d+-\d+(\|color-([0-9a-fA-F]{3}){1,2}(\|size-\d+)?)?|\w+)

由于我观察到(来自示例+原始正则表达式)“大小”意味着前面的所有字段都可用,“颜色”意味着前面的所有字段都可用,我刚刚创建了嵌套可选:

(\|color-([0-9a-fA-F]{3}){1,2}
  (\|size-\d+)?
)?

对于([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3}),我“简化”为([0-9a-fA-F]{3}){1,2}

于 2012-06-29T14:54:52.407 回答
1

您可以通过分解软件http://regexformat.com运行您的正则表达式

前:

watermark=(text-\w+\|position-\d+-\d+\|color-([A-Fa-f0-9]{3}(?:[A-Fa-f0-9]{3})?)\|size-\d+|text-\w+\|position-\d+-\d+\|color-([A-Fa-f0-9]{3}(?:[A-Fa-f0-9]{3})?)|text-\w+\|position-\d+-\d+|\w+)

后:

watermark=(?:text-\w+\|position-\d+-\d+(?:\|color-[A-Fa-f0-9]{3}(?:[A-Fa-f0-9]{3})?(?:\|size-\d+)?)?|\w+)

在此处输入图像描述

 watermark=
 (?:
    text- \w+ \| position- \d+ - \d+ 
    (?:
       \| color- [A-Fa-f0-9]{3} 
       (?: [A-Fa-f0-9]{3} )?
       (?: \| size- \d+ )?
    )?
  | \w+ 
 )
于 2021-04-09T18:50:09.730 回答