我正在阅读一个包含大量信息的文件,如下所示:
type dw_3 from u_dw within w_pg6p0012_01
boolean visible = false
integer x = 1797
integer y = 388
integer width = 887
integer height = 112
integer taborder = 0
boolean bringtotop = true
string dataobject = "d_pg6p0012_14"
end type
type dw_3 from u_dw within w_pg6p0012_01
integer x = 1797
integer y = 388
integer width = 887
integer height = 112
integer taborder = 0
boolean bringtotop = true
string dataobject = "d_pg6p0012_14"
end type
我做了正则表达式: (?i)type dw_\d\s+(.*?)\s+within(.*?)\s+(?!boolean visible = false)(.*)
我想提取所有不包含“boolean visible=false”的字符串,但我的字符串返回all。我也尝试了许多类似的职位上的堆栈,但结果是类似的我,请建议一种方法。
解决方案: (?i)type\\s+dw_(\\d+|\\w+)\\s+from\\s+.*?within\\s+.*?\\s+(string|integer)?\\s+.*\\s+.*\\s+.*\\s+.*?\\s+.*?\\s+.*?\\s*string\\s+dataobject\\s+=\\s+(.*?)\\s+end\\s+type")
这在regex-checker上运行得很好,但是当我在java上尝试它时,它一直在运行,没有给出任何输出
3条答案
按热度按时间kr98yfug1#
你可以用这个正则表达式
演示
这基本上定义了两个捕获组
第一捕获组
(\s*boolean visible = false)
会抓住的boolean visible = false
.第二捕获组
(.*)
将捕获除第一捕获组捕获之外的所有其他内容。现在,当你提取它时,只需捕获第二组,忽略第一组。
编辑
下面是一个澄清的例子:
在这个例子中,
方法获取文件的内容,如程序所示。
注意我们如何得到两个组,但是忽略第一个组,只打印第二个组。
看输出,没有那行
boolean visible = false
.输出
java实现
j9per5c42#
试试这个。看演示。
https://regex101.com/r/heex8w/1
lqfhib0f3#
如果你做一个正则表达式来匹配,它会更容易(也更易读)
"boolean visible = false"
然后排除包含匹配项的行。笔记:
因为我们正在使用
Files#lines(String)
,则不必在正则表达式中分隔单独的行。这已经为我们做了。这个
Matcher#find()
方法返回给定的字符序列中是否包含与正则表达式匹配的任何位置。我相信这就是你想要的。编辑:
现在,如果你真的想使用纯正则表达式,那么试试这个:
当且仅当它不包含
"boolean visible = false"
在它的任何地方。提取所需文本不需要复杂的反向引用/捕获组语义。请参见此处的单元测试证明:https://regex101.com/r/dbzdmb/1
编辑#2:
或者,如果您所要做的只是获取文件文本而没有任何
"boolean visible = false"
,则可以简单地用空字符串替换该目标字符串的每个示例。