不贪心的看背后

问题描述

我有这样的文字

其他文本 opt1 opt2 opt3 I_want_only_this_text 因为_of_this

我正在使用这个正则表达式:

(?<=opt1|opt2|opt3).*?(?=because_of_this)

哪个返回我:

opt2 opt3 I_want_only_this_text

但是,我只想匹配“I_want_only_this_text”。

实现这一目标的最佳方法是什么?

我不知道 opt 会以什么顺序出现,它们只是示例。实际用词会有所不同,而且会更多。

Test screenshot

实际数据: 正则表达式

(?<=※|を|備考|町|品は|。).*(?=のお届けとなります|でお届けします|にてお届け致します|にてお届けいたします)

文字

こだわり豚には通常の豚よりビタミンB1が2倍以上あります。私たちの育てた爱情たっぷりのこだわり豚をぜひ召し上がってください。商品说明名称えびの产こだわり豚切落し产地宫崎県えびの市内容量500g×8パック费用4kg赏味期限90日保存方法-15℃以下で保存すること提供者株式会社さつま屋产业备考・本お礼品は冷冻でのお届けとなります

我想得到什么:

冷冻で

解决方法

您可以添加否定前瞻 (?!\s*opt\d) 以断言没有 opt 和右侧的数字。您可以使用字符类来列出数字 1、2 和 3,而不是使用带有 | 的交替。

(?<=\bopt[123]\s(?!\s*opt\d)).*?(?=\s*\bbecause_of_this\b)

Regex demo

将匹配与捕获组一起使用可能会更有效:

\bopt[123]\s(?!\s*opt\d)(.*?)\s*\bbecause_of_this\b

Regex demo

,

关于:

let rec Contains (num : int) list =
   match list with
   |  [] -> false
   |  head::tail -> head = num || (Contains num tail)

查看在线demo

.*\bopt[123]\b\s*(.*?)\s*because_of_this\b - 除换行符以外的任何字符的贪婪匹配,直到最后一次出现: .* - 一个词边界,后跟字面意思的“opt”,尾随数字 1、2 或 3 和另一个词边界。

  • \bopt[123]\b - 0+ 个空白字符。
  • \s* - 第 1 个捕获组,最多包含 0 个以上字符的延迟匹配:
  • (.*?) - 0+ 个空白字符。
  • \s* - 字面意思是“because_of_this”后跟词边界。

如果你需要交替写出这个:

because_of_this\b

看到那个demo

,

你可以使用

(?<=※|を|備考|町|品は|。)(?:(?!※|を|備考|町|品は|。).)*?(?=のお届けとなります|でお届けします|にてお届け致します|にてお届けいたします)

参见regex demo。该方案与 (?<=opt1|opt2|opt3)(?:(?!opt1|opt2|opt3).)*?(?=because_of_this) 中的相同(请参阅 demo)。

较长字符串中相同模式的tempered greedy tokenallows you to match multiple occurrences

详情

  • (?<=※|を|備考|町|品は|。) - 正向后视,匹配紧跟在后视中列出的备选位置之一的位置
  • (?:(?!※|を|備考|町|品は|。).)*? - 除换行符以外的任何字符,零个或多个,但尽可能少出现,这不是负前瞻中任何替代模式的起点
  • (?=のお届けとなります|でお届けします|にてお届け致します|にてお届けいたします) - 正向前瞻,需要替代模式之一立即出现在当前位置的右侧。