【问题标题】:Invalid lookbehind pattern无效的后视模式
【发布时间】:2021-04-02 07:25:30
【问题描述】:

我只是想获取以下文字:

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 之后的所有内容直到新行,但正如您在上面看到的,我在后视中收到关于无效模式的错误。

我应该做些什么来解决这个问题?

【问题讨论】:

  • 试试/(?:\G(?!\A)|Password length).*\K\R(?!\R)/
  • 最终结果只是\n,而不是从第二行开始到最后一行的所有内容,上面有13
  • 您要求获取所有行。好的,那你需要data[/Password length.*\R(?m:(.*?))\R{2}/, 1]

标签: regex ruby


【解决方案1】:

你可以使用

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

请参阅Rubular demo详情

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

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

另一种选择:

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

this Rubular demo。详情:

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

【讨论】:

  • 这对我有用,也教会了我一些新东西。我真的很感激!
  • 非常感谢!太棒了。我也非常感谢两者之间的细分和解释。
猜你喜欢
  • 2019-11-27
  • 2021-08-11
  • 2014-07-09
  • 2023-03-11
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
相关资源
最近更新 更多