正则表达式匹配的行数不超过一定数量的特定字符?

时间:2018-02-08 22:44:17

标签: php regex

到目前为止这是我的正则表达式(假设PHP风格):

^(([^\\]+)\\([^\\]+)){1,4}$

我的测试数据:

U:\16. New Products\#Complete\Bottle Openers\20170210 St Patrick Bottle Openers\Small Lifestyles
U:\16. New Products\#Complete\Canvas
U:\16. New Products

目标是找到不超过4个斜杠的所有行。在此示例中,我希望匹配第二行和第三行,但是当我在regex101中对其进行测试时,它似乎匹配多行,尽管设置multiline并使用^和{{ 1}}。我做错了什么?

1 个答案:

答案 0 :(得分:1)

count += 1模式是一个否定的字符类,它匹配任何char而不是[^\\] char,因此,它可以匹配换行符。要快速解决问题,您可以将\(可能还有\n)添加到否定字符类并使用

\r

请参阅regex demo^(([^\\\n\r]+)\\([^\\\n\r]+)){1,4}$ 无法匹配CR和LF符号,并匹配除[^\\\n\r],LF和CR字符之外的任何字符。

此任务的更好的正则表达式是

\

或者,将最后一个量化的部分设置为占有性以提高效率:

^[^\\\n\r]*(?:\\[^\\\n\r]*){0,4}$

请参阅this regex demo

<强>详情

  • ^[^\\\n\r]*(?:\\[^\\\n\r]*){0,4}+$ - 字符串开头
  • ^ - 除[^\\\n\r]*,LF和CR
  • 以外的零个或多个字符
  • \ - 0到4次出现
    • (?:\\[^\\\n\r]*){0,4} - \\字符
    • \ - 除[^\\\n\r]*,LF和CR
    • 以外的零个或多个字符
  • \ - 字符串结束。