【问题标题】:Regular Expression to match a list of strings and ignore a list of strings正则表达式匹配字符串列表并忽略字符串列表
【发布时间】:2017-12-05 09:16:43
【问题描述】:

我正在寻找满足以下要求的正则表达式

  1. 忽略所有以 zzTest 开头的字符串
  2. 匹配所有包含单词rest且不以zzTest开头的字符串

输入字符串:

zzTest.docs:service1
zzTest.rest:service2
Regression.rest:service1
Regression.docs.service2 

预期输出:

Regression.rest:service1

尝试使用正则表达式 \s*(?!\w*(zzTest)\w*)\w*(rest)\w*\s* 当输入字符串中没有点(。)时,它的工作原理

任何帮助表示赞赏

【问题讨论】:

  • 只要使用s.matches("(?!zzTest).*rest.*")
  • 我真的很喜欢你的解决方案,它比我的有点冗长...... @WiktorStribiżew
  • 谢谢。这有效 s.matches("(?!zzTest).*rest.*")。我已将其修改为 (?!(zzTest|Ignore)).*(rest|api).* 以使其适用于多个单词

标签: java regex string


【解决方案1】:

你可以使用

s.matches("(?!zzTest).*rest.*")

该模式将按如下方式工作:

  • ^ - 字符串开头(隐含在 matches 中)
  • (?!zzTest) - 不以 zzTest 开头
  • .*rest.* - 除换行符之外的任何 0+ 个字符,尽可能多,直到该行中的最后一个 rest,然后是该行的其余部分。
  • $ -(隐含在matches()):字符串结束。

要匹配整个字符串,请在模式的开头添加(?s)

要扩展它,请使用交替:

s.matches("(?!zzTest|yyTest|etc).*(?:rest|more here).*")

要添加全词匹配支持,请在单词周围使用\b

s.matches("(?!\\b(?:zzTest|yyTest|etc)\\b).*\\b(?:rest|more here)\\b.*")

【讨论】:

    【解决方案2】:

    试试这个:

    stringList.stream().filter(s -> !s.startsWith("zzTest")).filter(s -> s.contains("rest"));
    

    虽然这不是正则表达式解决方案。

    【讨论】:

    • 为什么不呢,符合要求,OP没有提到要匹配整个单词(那么,regex是强制性的)。
    • 抱歉,正在寻找可以配置和更新的正则表达式。
    猜你喜欢
    • 2017-08-31
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 2013-08-30
    • 2012-06-05
    • 2013-12-25
    相关资源
    最近更新 更多