如何在换行符处终止我的模式?

How do I terminate my pattern at a line break?

我有一个来自我要处理的 pdf 的长字符。 我有 Table X. Name of the table 的重复实例,在我的角色中总是跟着 \r\n

但是,当我尝试使用 List_Tables <-str_extract_all(Plain_Text, "Table\s+\d+\.\s+(([A-z]|\s))+\r\n") 提取列表中的所有表格时,我确实经常有另一行仍在提取中,例如

> List_Tables
[[1]]
 [1] "Table 1. Real GDP\r\n                                                           Percentage changes\r\n"                                                                    
 [2] "Table 2. Nominal GDP\r\n                                          Percentage changes\r\n"    

我的代码中遗漏了什么?

\s 匹配所有空格,包括换行符! 与贪婪量词 + 结合使用时,这意味着 (([A-z]|\s))+ 匹配,在你的第一个例子中,

 Real GDP\r\n       […]       Percentage changes\r\n

解决此问题的最简单方法是使用非贪婪量词:即 +? 而不是 +

为了完整起见,我会提到还有其他选择,但它们会变得更加复杂。例如,您可以使用否定断言来包含“if”测试以匹配不是换行符的空格;或者您可以使用字符 class [ \t] 而不是 \s,这更严格但也更明确并且可能更接近您想要的。