我有一个这样的输入字符串
val input = """["abc:def&ghi:jkl"]"""
我想提取abc
并ghi
所以我写了这个正则表达式,它有效
val regex = """(?<=["&])(w+)(?=[:])""".r
regex.findAllIn(input).foreach(println)
所以基本上我向前看:
,看看后面的"
或&
。
目前为止,一切都好。但是现在我有这样的输入
val input = """["abc:de_&_f:xyz&ghi:jkl"]"""
它匹配
abc
_f
ghi
我想改变我的正则表达式的逻辑。
当向前看对:
是正确的,向后看对&
是正确的,对_&_
是错误的时,匹配一个w+
所以我想同时使用正面和负面的背后看。我该怎么做?
您可以在正则表达式的后视表达式中添加负后视和负前视,如下所示:
(?<=(?:(?<!_)&(?!_)|"))w+(?=:)
正则表达式演示
在这里,我们在后视条件中使用了一个交替,即:
(?<!_)&(?!_)|"
:匹配&
,如果它没有前后_
|
: 或"
匹配"
对于您的情况,这个较短的正则表达式也可能有效:
(?<=["&])(?<!_&)w+(?=:)
正则表达式演示 2
如果w+
前面有_&
,(?<!_&)
将跳过比赛。
您可以先使用否定字符类[^W_]w*
更新模式以使其与w
中的下划线不匹配
由于您只需要单个匹配项,因此可以省略捕获组()
并且可以省略[:]
中的方括号。
(?<=["&])[^W_]w*(?=:)
(?<=["&])
积极向后看,断言左边的东西是"
或&
[^W_]
匹配除_
之外的单词字符w*
匹配 0+ 单词字符(?=:)
积极向前看,断言右边的东西是:
正则表达式演示 |斯卡拉演示