首页 > 解决方案 > 无效的后视模式

问题描述

我只是想采用以下文字:

Password length (length ordered)
5 = 1 (0.37%)   
6 = 1 (0.37%) 
7 = 1 (0.37%)         
8 = 157 (58.58%) 
9 = 55 (20.52%)
10 = 33 (12.31%)
11 = 12 (4.48%)                  
12 = 6 (2.24%)                   
13 = 2 (0.75%)  

Password Length并找到和之间存在的每条新线\n\n。这是我目前正在做的事情

data[/(?<=Password length)(.*?)(?=\n\n)/m]

(length ordered)但这在第一行中捕获。

我试图做这样的事情:

44] pry(main)> data[/(?<=Password length.*?\n)(.*?)(?=\n\n)/m]
(eval):2: invalid pattern in look-behind: /(?<=Password length.*?\n)(.*?)(?=\n\n)/m

基本上捕获Password length新行之后的所有内容,但正如您在上面看到的,我在后视中收到有关无效模式的错误。

我应该怎么做而不是这个来解决这个问题?

标签: regexruby

解决方案


您可以使用

data[/Password length.*\R(?m:(.*?))\R{2}/, 1]

请参阅Rubular 演示详情

  • Password length- 文字字符串
  • .*- 线路的其余部分
  • \R- 换行序列
  • (?m:(.*?))- 匹配任何字符(包括换行字符)的内联修饰符组.,捕获匹配任何零个或多个字符但尽可能少的组 1
  • \R{2}- 双换行序列。

1参数仅返回第一个捕获组内的值(请参阅参考资料str[regexp, capture] → new_str or nil

替代:

data[/Password length.*\R\K.*(?:\R(?!\R).*)*/]

请参阅此 Rubular 演示。细节:

  • Password length.*\R- Password length,该行的其余部分和换行符序列
  • \K- 匹配重置运算符,它从匹配内存缓冲区中删除所有匹配的文本
  • .*- 一行,除换行符之外的任何零个或多个字符,尽可能多
  • (?:\R(?!\R).*)*- 零个或多个不以双换行序列结尾的行,其中\R(?!\R).*匹配一个不紧跟另一个换行序列的换行符,并.*匹配该行的其余部分。

推荐阅读