正则表达式提取包含特定字符串的两个单词之间的字符串

时间:2019-02-28 16:25:00

标签: regex

我有以下字符串

abc-12d-ef-oy-5678-xyz--**--20190120075439322am--**--ghi-66d-ef-oy-8877-sdf--**--sfdfdsgfg--**--20190120075765487am

这是一种多字符分隔的字符串,以'-**-'分隔,我正在尝试提取其中带有-oy-标记的第一和第二个单词。这是表中的一列。我正在使用regex_extract方法,但无法提取包含字符串并以字符串结尾的字符串。

这是我尝试过的一种模式.*(.*oy.*)--

3 个答案:

答案 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]以允许您想要匹配的字符,例如大写字符。

Regex demo | Java demo

如果匹配项应在定界符之间,则可以使用正向后看和正向前看以及交替显示:

(?<=^|--\\*\\*--)[a-z0-9]+(?:-[a-z0-9]+)*-oy(?:-[a-z0-9]+)+(?=--\\*\\*--|$)

查看Java demo

答案 1 :(得分:1)

您可以使用此正则表达式将匹配包含-oy-的字符串并将其捕获到group1和group2中。

^.*?(\w+(?:-\w+)*-oy-\w+(?:-\w+)*).*?(\w+(?:-\w+)*-oy-\w+(?:-\w+)*)

此正则表达式基本上匹配两个字符串定界符,分隔符包含-oy-,并使用此(\w+(?:-\w+)*-oy-\w+(?:-\w+)*)来捕获文本。

Demo

答案 2 :(得分:1)

您是否可以从捕获组中选择值?

(?:--\*\*--|^)(.*?-oy-.*?)(?:--\*\*--|$)

?:-非捕获组,与定界符,行首或行尾匹配,但不创建捕获组

*? -延迟匹配,因此您只获取字段内容

img

---此后是第二次刺伤---

这令人费解。希望您可以使用Lookahead和Lookbehind。我遇到的最后一个问题是最终的记录是“ Greedy”,并且在此之前也被吸引。因此,我必须在捕获组中为您的定界符添加排除项。

看看这是否适合您。

(?<=--\*\*--|^)((?:(?:(?!--\*\*--).)*)-oy-(?:(?:(?!--\*\*--).)*))(?=--\*\*--|$)

https://regex101.com/r/aUAvcx/1

基本上(?:是,所以我们没有太多的捕获组可以使用。

这包括三个部分:

  1. 后向-确保字段由定界符(或行首)框住
  2. 捕获组-抓取字段的内容,确保没有将定界符吸入其中
  3. 前瞻-确保字段由定界符(或行尾)框起

就捕获组而言,我检查-oy-的左侧和右侧,以确保分隔符不存在。