使用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的功能?
谢谢
答案 0 :(得分:0)
执行此操作的正确方法是使用条件句。这是我使用的模式。
(?(?![\w-]+>>$)(?:([^\s>]*)(?:.*))|([^\w\W]))
我将为您提供细分:
(?...)
是if
有条件的
(?![\w-]+>>$)
检查字符串是否包含有毒的后缀
(([^ \n>]*)(?:.*))
捕获所有内容,直到您遇到某个空格或>
|
或
([^\w\W])
没有捕获任何内容。
因此if条件的语法是(?If(condition)then | else)。此模式的作用是,如果字符串不包含后缀,则返回该字符串直到第一个空格,但如果包含后缀,则不匹配任何内容。