如何使用正则表达式在groovy中排除字符串?

时间:2014-07-18 23:05:24

标签: regex groovy

我有一个字符串字符,例如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

非常感谢任何评论。

4 个答案:

答案 0 :(得分:2)

def s = "XXXabcdacefgabcdcbefgabcdmn" 
def m = s =~ /abcd(?:(?!efg).)*/
(0..<m.count).each { print m[it] + '\n' }

Working Demo

<强>解释

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).*$)

DEMO


或者试试这个

(abcd(.*?)(?=efg|$))

DEMO

示例代码:

def str = "XXXabcdacefgabcdcbefgabcdmn" 
def matcher = str =~ /(abcd(.*?)(?=efg)|(?<=efg).*$)/
matcher.each {      println it[0] }

答案 2 :(得分:0)

好的,您可以将此模式与匹配器一起使用:

(?:(?=abcd)|\G(?!\A)efg)((?:(?!efg).)*)

您需要的子字符串位于第一个捕获组中。

demo

另一种方式:

(?:(?=abcd)|\G(?!\A)efg)((?>[^e]+|e(?!fg))*)

demo

答案 3 :(得分:0)

这里有一些不使用正则表达式但Groovy提供的纯工具。 :)

def str = "XXXabcdacefgabcdcbefgabcdmn"

assert ['abcdac', 'abcdcb', 'abcdmn'] == 
    str.split(/efg/).findAll { it.contains(/abcd/) }*.dropWhile { it != 'a' }