regex - 无效的后视模式
问题描述
我只是想采用以下文字:
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
新行之后的所有内容,但正如您在上面看到的,我在后视中收到有关无效模式的错误。
我应该怎么做而不是这个来解决这个问题?
解决方案
您可以使用
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).*
匹配一个不紧跟另一个换行序列的换行符,并.*
匹配该行的其余部分。
推荐阅读
- java - Spring批处理应用程序需要在DB重启后重新部署
- angular - Angular:从动态字符串绑定组件选择器
- java - 如何在 Java 中获取当前 RabbitMQ 的 IP 地址?
- javascript - Android webview在javascript文件中发现不存在的语法错误
- python - 在 DataFrame 上调用的 Pandas 应用程序被错误地视为 Series 对象?
- jenkins - 通过代理上的 curl 将 .apk 上传到结构
- python - 绘制两个 pandas 数据框列之间的差异分布
- java - PropertyPlaceholderConfigurer 和 PropertySourcesPlaceholderConfigurer 运行方式不同
- sharepoint - 一个 If 语句,不同的默认结果
- java - Maven 构建战需要使用 jenkins 在 Weblogic 12.2.x 上部署