Java:匹配正则表达式,除非以任意后缀结尾

时间:2018-07-05 16:00:15

标签: java regex

我想做什么:

使用Java,我想匹配一个RegEx模式,除非匹配后紧跟一个“毒药”后缀。

示例:

 "legitString" RETURNS "legitString"

 "legitString blabla" RETURNS "legitString"

 "legitString PoisonousSuffix" RETURNS "legitString"

 "legitStringPoisonousSuffix" RETURNS no match

我的用例:

我需要按照特定的模式从文件中解析尽可能多的引用。 但是文件的某些行会被截断,并且不一定总是相同的长度(!)。

幸运的是,发生这种情况时,该行以“ >>”结尾。我必须假定该引用被截断,并且必须丢弃它。因此,在我的情况下,“ >> $”将是有毒的后缀。 另一方面,如果“ >>”位于文本中间,则应像平常一样安全地提取引用。 (参考号以数字结尾,但每次的数字位数可能不同,所以我不能使用它。)

所以在我的情况下:

"REF" RETURNS "REF"

"REF >>" RETURNS "REF"

"REF>>" RETURNS nothing

"REF>> bla " RETURNS "REF" // because in my case, the poison is only poisonous if in the end

我看过:https://stackoverflow.com/tags/regex/info 但是我尝试了语法

myRegex(?!>>$)

,它看起来不对。当行以“ >>”结尾时,它将截断引用的最后一个合法数字,这是最糟糕的情况:引用被破坏。

我看过:Regex for string not ending with given suffix但:

myRegex(?:(?!>>).).$

拒绝合法引用。

我的确切正则表达式(无毒):

   \b(SWN-)?WZ-SB\d{2}(-\d{2}){2}-[A-Z]?\d* 

应返回SWN-WZ-SB00-49-03-C11:

"SWN-WZ-SB00-49-03-C11>> bla"

"SWN-WZ-SB00-49-03-C11 >>  "

"SWN-WZ-SB00-49-03-C11 >>"

"SWN-WZ-SB00-49-03-C11 >> bla"

,不适用:

"SWN-WZ-SB00-49-03-C11>>"

奖金

是否有一种方法可以概括并具有接受regexPattern和poisonousSuffix并返回safeRegexPattern的功能?

谢谢

1 个答案:

答案 0 :(得分:0)

执行此操作的正确方法是使用条件句。这是我使用的模式。

(?(?![\w-]+>>$)(?:([^\s>]*)(?:.*))|([^\w\W]))

我将为您提供细分:

(?...)if有条件的

(?![\w-]+>>$)检查字符串是否包含有毒的后缀

(([^ \n>]*)(?:.*))捕获所有内容,直到您遇到某个空格或>

|

([^\w\W])没有捕获任何内容。

因此if条件的语法是(?If(condition)then | else)。此模式的作用是,如果字符串不包含后缀,则返回该字符串直到第一个空格,但如果包含后缀,则不匹配任何内容。

Demo