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?
答案 0 :(得分:2)
你想要这样的东西吗?
(?=(?:\S+\s+){3}EndToken)(?:\S+\s+){2}\S+
如果要提取的字符串包含variable number of words
,那么您可以尝试使用此正则表达式。
(?<= )\b(?:(?!(?<=StartToken )\S+\s+).)+(?= EndToken)
(?<= )\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
后跟任意字符零次或多次,直至字符串结尾。