我有以下字符串
abc-12d-ef-oy-5678-xyz--**--20190120075439322am--**--ghi-66d-ef-oy-8877-sdf--**--sfdfdsgfg--**--20190120075765487am
这是一种多字符分隔的字符串,以'-**-'分隔,我正在尝试提取其中带有-oy-标记的第一和第二个单词。这是表中的一列。我正在使用regex_extract方法,但无法提取包含字符串并以字符串结尾的字符串。
这是我尝试过的一种模式.*(.*oy.*)--
答案 0 :(得分:2)
如果-oy-
不能位于开头或结尾,则可以使用此模式将两个连字符分隔的字符串与-oy-匹配:
[a-z0-9]+(?:-[a-z0-9]+)*-oy(?:-[a-z0-9]+)+
正则表达式详细信息
[a-z0-9]+
匹配1次以上a-z0-9 (?:
非捕获组
-[a-z0-9]+
匹配-
并进行1次以上a-z0-9 )*
关闭组并重复0次以上-oy
字面上匹配(?:-[a-z0-9]+)+
对与-
相匹配的组重复1次以上,对a-z0-9重复1次以上您可以扩展字符类[A-Za-z0-9]
以允许您想要匹配的字符,例如大写字符。
如果匹配项应在定界符之间,则可以使用正向后看和正向前看以及交替显示:
(?<=^|--\\*\\*--)[a-z0-9]+(?:-[a-z0-9]+)*-oy(?:-[a-z0-9]+)+(?=--\\*\\*--|$)
答案 1 :(得分:1)
您可以使用此正则表达式将匹配包含-oy-
的字符串并将其捕获到group1和group2中。
^.*?(\w+(?:-\w+)*-oy-\w+(?:-\w+)*).*?(\w+(?:-\w+)*-oy-\w+(?:-\w+)*)
此正则表达式基本上匹配两个字符串定界符,分隔符包含-oy-
,并使用此(\w+(?:-\w+)*-oy-\w+(?:-\w+)*)
来捕获文本。
答案 2 :(得分:1)
您是否可以从捕获组中选择值?
(?:--\*\*--|^)(.*?-oy-.*?)(?:--\*\*--|$)
?:-非捕获组,与定界符,行首或行尾匹配,但不创建捕获组
*? -延迟匹配,因此您只获取字段内容
---此后是第二次刺伤---
这令人费解。希望您可以使用Lookahead和Lookbehind。我遇到的最后一个问题是最终的记录是“ Greedy”,并且在此之前也被吸引。因此,我必须在捕获组中为您的定界符添加排除项。
看看这是否适合您。
(?<=--\*\*--|^)((?:(?:(?!--\*\*--).)*)-oy-(?:(?:(?!--\*\*--).)*))(?=--\*\*--|$)
https://regex101.com/r/aUAvcx/1
基本上(?:是,所以我们没有太多的捕获组可以使用。
这包括三个部分:
就捕获组而言,我检查-oy-的左侧和右侧,以确保分隔符不存在。