不甘心回头看

Ungreedy with look behind

我有这样的文字:

other text opt1 opt2 opt3 I_want_only_this_text because_of_this

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

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

哪个returns我:

opt2 opt3 I_want_only_this_text

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

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

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

Test screenshot

实际数据: 正则表达式

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

文字

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

我想得到的:

冷凍で

您可以添加否定前瞻 (?!\s*opt\d) 来断言没有 opt 和右边的数字。您可以使用字符 class 来列出数字 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

怎么样:

.*\bopt[123]\b\s*(.*?)\s*because_of_this\b

在线查看demo.

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

  • \s* - 0+ 个空白字符。
  • (.*?) - 第一个捕获组,具有 0+ 个字符的惰性匹配,最多为:
  • \s* - 0+ 个空白字符。
  • because_of_this\b - 字面意思是“because_of_this”,后跟单词边界。

如果您需要交替写出:

.*\b(?:opt1|opt2|opt3)\b\s*(.*?)\s*because_of_this\b

看到demo

您可以使用

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

参见 regex demo. The scheme is the same as in (?<=opt1|opt2|opt3)(?:(?!opt1|opt2|opt3).)*?(?=because_of_this) (see demo)。

较长字符串中相同模式的 solution allows you to match multiple occurrences

详情

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