正则表达式跳过令牌之间的第一个单词

时间:2018-04-18 15:02:53

标签: regex hive

regexp guru需要帮助!

我有一个字符串,看起来像:

WordA1 wordA2 wordAN StartToken Skipword WordB1 WordB2 WordBN EndToken WordV1 WordCN

我希望提取WordB1 WordB2 WordBN子字符串,在StartToken和EndToken之间取消所有内容并跳过内部的第一个单词。 Usualy我用一些模式来解决这些问题:

(?<= StartToken )\S+\s\K.*?(?= EndToken )

问题是,我正在实现它的系统(配置单元)不支持“\ K”功能。它也不可能使用不固定宽度的lookbehind(不幸的是,SkipWord不是固定长度),如:

(?<= StartToken \S+\s).*?(?= EndToken )

另一种解决方案是

(?<= StartToken )(\S+\s)(.*)?(?= EndToken )

并采取第2组,但这非常困难,需要付出很多努力和代码更改才能获得确切的组号。

所以我的问题是:有没有人有简单优雅的解决方案,它可以在蜂巢上工作,不需要将组号带入regexp_extract?

2 个答案:

答案 0 :(得分:2)

你想要这样的东西吗?

(?=(?:\S+\s+){3}EndToken)(?:\S+\s+){2}\S+

Demo

如果要提取的字符串包含variable number of words,那么您可以尝试使用此正则表达式。

(?<= )\b(?:(?!(?<=StartToken )\S+\s+).)+(?= EndToken)

Demo

  • (?<= )\b:表示word-starting point(bounday)
  • (?= EndToken):此正则表达式中的角色ending anchor
  • \b(?:(?!(?<=StartToken )\S+\s+).)+:避免使用以“\S+”开头的单词(StartToken)并尝试将每个word-starting point(边界)的所有内容与ending anchor匹配

答案 1 :(得分:0)

this page我看到regexp_extract以外还有regexp_replace

您可以尝试使用alternation选择令牌之前和之后的部分,并将其替换为空字符串:

(?:^.*StartToken \S+\s| EndToken.*$)

  • (?:非捕获组
  • ^.*StartToken \S+\s从字符串matchany字符的开头开始零次或多次,后跟StartToken,一个或多个非空白字符和一个空白字符。
  • |
  • EndToken.*$)匹配EndToken后跟任意字符零次或多次,直至字符串结尾。