我正在尝试提取两个固定字符串之间的字符串。具体来说,我希望在“地址:”和“此授权”之间的字符串跨越多行。这是一个示例:
Address: The PowerPool Corp 1434 Holyfried Route, Unit A Melope, VA 21151 This grant is issued
我尝试了以下代码,但是它不起作用:
str_extract(test_case, "(?<=Address:\n)[^\\n]+")
输出
[1] "The PowerPool Corp"
如何获取地址的所有三行?
答案 0 :(得分:2)
在基数R中使用sub
似乎可以正常工作:
cat(sub("Address:(.*)This grant.*", "\\1", test_case))
#The PowerPool Corp
#1434 Holyfried Route, Unit A
#Melope, VA 21151
使用cat
以格式化的方式显示输出。
数据
test_case <- "Address:
The PowerPool Corp
1434 Holyfried Route, Unit A
Melope, VA 21151
This grant is issued"
答案 1 :(得分:2)
您可以通过先匹配Address:来获得不带dotall模式的匹配,然后在组1中捕获所有以“ This grant”开头的行。
JTextPane textPane = new JTextPane(document);
textPane.setEditable(true);
Element elememt = doc.getCharacterElement(docOffset);
if (StyleConstants.isSuperscript(element.getAttributes())) { ...
部分
Address:\r?\n((?:(?!This grant\b).*(?:\r?\n|$))*)
匹配地址:和换行符Address:\r?\n
捕获第1组
(
非捕获组
(?:
如果右边直接不是“ This grant”,则匹配整行(?!This grant\b).*
匹配换行符或断言字符串的结尾(?:\r?\n|$)
关闭非捕获组并重复以获取所有行)*
例如
)
输出
library(stringr)
test_case <- "Address:
The PowerPool Corp
1434 Holyfried Route, Unit A
Melope, VA 21151
This grant is issued"
str_match(test_case, "Address:\\r?\\n((?:(?!This grant\\b).*(?:\\r?\\n|$))*)")[,2]
答案 2 :(得分:0)
答案 3 :(得分:0)
在str_extract
中,.
不会匹配行终止符(\n
),除非您告知。将regex
修饰符函数与参数dotall = T
配合使用以匹配多行。请注意,我还通过删除[^\\n]+
并添加.*
以及(?=\n\nThis grant)
之后的后缀来修正您的正则表达式:
str_extract(test_case,
regex("(?<=Address:\n).*(?=\n\nThis grant)",
dotall = T
)
)
# [1] "The PowerPool Corp\n1434 Holyfried Route, Unit A\nMelope, VA 21151"
也许还有更简单/更快的方式来处理此问题。例如,如果您知道第一行到最后一行总是垃圾,则可以在\n
处拆分,然后选择相关行或删除不相关的行,即str_split(test_case, "\n")[[1]][2:4]
与str_split(test_case, "\n")[[1]][-c(1, 5, 6)]