我有一个字符串字符,例如XXXabcdacefgabcdcbefgabcdmn。我需要从原始字符串中排除字符串“efg”,每个项目必须以“abcd”开头(所以我不能简单地使用split)。
以下是我的示例代码:
def str = "XXXabcdacefgabcdcbefgabcdmn"
def matcher = (str =~ /^\/(?!efg)([a-z0-9]+)$/)
//I just tried the solution searched from google but it don't work.
matcher.each {
println it
}
预期结果应为:
abcdac
abcdcb
abcdmn
非常感谢任何评论。
答案 0 :(得分:2)
def s = "XXXabcdacefgabcdcbefgabcdmn"
def m = s =~ /abcd(?:(?!efg).)*/
(0..<m.count).each { print m[it] + '\n' }
<强>解释强>:
abcd # 'abcd'
(?: # group, but do not capture (0 or more times):
(?! # look ahead to see if there is not:
efg # 'efg'
) # end of look-ahead
. # any character except \n
)* # end of grouping
你也可以在这里分开:
def s = "XXXabcdacefgabcdcbefgabcdmn"
def m = s.split(/efg/)*.dropWhile { it != 'a' }
println m.join('\n')
答案 1 :(得分:0)
我需要排除字符串&#34; efg&#34;从原始字符串开始,它应以&#34; abcd&#34;
开头
这可能会对你有所帮助。从所需索引中获取匹配的组。
(abcd(.*?)(?=efg)|(?<=efg).*$)
或者试试这个
(abcd(.*?)(?=efg|$))
示例代码:
def str = "XXXabcdacefgabcdcbefgabcdmn"
def matcher = str =~ /(abcd(.*?)(?=efg)|(?<=efg).*$)/
matcher.each { println it[0] }
答案 2 :(得分:0)
好的,您可以将此模式与匹配器一起使用:
(?:(?=abcd)|\G(?!\A)efg)((?:(?!efg).)*)
您需要的子字符串位于第一个捕获组中。
另一种方式:
(?:(?=abcd)|\G(?!\A)efg)((?>[^e]+|e(?!fg))*)
答案 3 :(得分:0)
这里有一些不使用正则表达式但Groovy提供的纯工具。 :)
def str = "XXXabcdacefgabcdcbefgabcdmn"
assert ['abcdac', 'abcdcb', 'abcdmn'] ==
str.split(/efg/).findAll { it.contains(/abcd/) }*.dropWhile { it != 'a' }