使用RegEx使用备用行尾字符提取多行(换行符,返回,字符串结尾)

时间:2017-08-31 22:08:59

标签: regex

我在这里介绍问题和解决方案。我在SO中进行了广泛的研究后发现了这个,发现了许多相关的例子,但没有一个与我的确切用例匹配。

用例:

  • 您有一个包含多行的源字符串,您需要提取 前n行。
  • 每一行都可以以这些字符结尾:
    换行\n,返回\r或字符串结尾$

示例数据:

每行的内容在此不感兴趣/关注。源字符串中的行数可以变化,但我想将行数限制为最大数量。

Clip 08.jpg
Clip 31.jpg
Clip 31b.jpg
Clip 32.jpg
Clip 40.jpg
Clip 40b.jpg
Clip 53.jpg
Clip 54.jpg
Maui Clip 53b.jpg

答案:

^((?:.*(?:\n|\r|$)){1,5})

其中最大行数(您要提取的数字)是量词{1,5}中的第二个数字,在本例中为#34; 5"。

如果有人可以改进此解决方案,或发现任何问题,请在此处发布。

2 个答案:

答案 0 :(得分:1)

我发现这是一个更好的解决方案。

(?m)(?:^.*\R?){1,20}

https://regex101.com/r/o2D6iG/2

 (?m)            # Inline modifier: Multi-line mode
 (?:             # Cluster
      ^               # BOL
      .*              # optional not newlines
      \R?             # optional line terminator
 ){1,20}         # End Cluster, 1-20 times

如果你选择了行终止符,它会处理EOS 此外,当多行模式生效时,它会强制\R匹配
或者它不会前进。

如果您没有\R构造,则可以使用低功能系列 对它的变化。

(?m)(?:^.*(?:\r?\n|\r)?){1,20}

https://regex101.com/r/KxxeAK/1

 (?m)                          # Inline modifier: Multi-line mode
 (?:                           # Cluster
      ^                             # BOL
      .*                            # optional not newlines
      (?: \r? \n | \r )?            # optional line terminator
 ){1,20}                       # End Cluster, 1-20 times

并且,您可能会取消多线模式(这只是保险)

(?:.*(?:\r?\n|\r)?){1,20}

的JavaScript https://regex101.com/r/jDTIMH/1

https://regex101.com/r/uqoP8Q/1

答案 1 :(得分:0)

使用以下RegEx模式:

^((?:.*(?:\n|\r|$)){1,<NumOfLinesToExtract>})

其中<NumOfLinesToExtract>是从源列表顶部提取的行数。例如:
^((?:.*(?:\n|\r|$)){1,5})

会导致:

Clip 08.jpg
Clip 31.jpg
Clip 31b.jpg
Clip 32.jpg
Clip 40.jpg

有关详细信息,请参阅https://regex101.com/r/Xp1jwT/2

此RegEx执行以下操作:

  • 将其中一条线提取到quantifier
  • 的最大参数设置的最大线数
  • 如果Source的行数少于最大行数,则返回所有行。
  • 它匹配以下列任何字符结尾的行:
    • New Line \ n
    • 返回\ r \ n
    • 字符串结束$