regex 匹配文本中从特定单词/模式开始的多个正则表达式组

kokeuurv  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(108)

我尝试匹配百分比的所有示例(例如20%)在一个特定的模式(或在这种情况下一个词)之后:

Lorem ipsum dolor 10% sit amet, consectetur adipiscing elit. Morbi et 
feugiat Discount vitae 15% urna. Sed 20% et lorem in dapibus. 
Mauris arcu dui, vestibulum eget eros eu, eleifend luctus risus.

字符串
我想匹配15%和20%,但不是10%。它应该通过确保匹配的百分比出现在单词Discount出现之后来确定这一点。
这是我提出的模式,但它似乎符合所有百分比:

(?<=Discount)*(\d+%)+


x1c 0d1x的数据
这将使用C# / .NET正则表达式引擎。

kknvjkwl

kknvjkwl1#

在模式(?<=Discount)*(\d+%)+中,您可以选择重复一个lookbehindAssert,该Assert仅在 * 当前位置 * 的正左侧Assert单词“Discount”,因此0次也足够了,您将匹配所有出现的(\d+%)+
如果您只需要一个值,则不需要捕获组,因为此模式(\d+%)+重复1+乘以1+位数,并且%
为了只获取一个值,你可以这样写模式,并使用单词边界来防止部分单词匹配:

(?<=\bDiscount\b.*)\b\d+%

字符串
模式匹配:

  • (?<=正向后查找Assert
  • \bDiscount\b.*匹配单词“Discount”后跟0+次除换行符以外的任何字符(因为在“Discount”和\d+%模式之间还有其他字符)
  • )关闭查找
  • \b A字边界
  • \d+%匹配1+次any digit%

Regex demo
在.NET中,您还可以使用Group.Captures属性来使用重复捕获组

\bDiscount\b(?:.*?(\b\d+%))+


Regex demo

uxhixvfz

uxhixvfz2#

你可以使用(可变长度)负前看,而不是像Bird #4那样使用(可变长度)正后看:

\b\d+%(?!.*\bDiscount\b)

字符串
Demo
正则表达式可以分解如下。

\b          # match a word boundary
\d+%        # match one or more (+) digits (`\d`) followed by '%' 
(?!         # begin a negative lookahead
  .*        # match zero or more (*) characters other than line terminators
  \b        # match a word boundary
  Discount  # match 'Discount'
  \b        # match a word boundary
)           # end the negative lookahead


请注意,C是支持可变长度(正和负)lookbehind的少数语言之一。大多数主流语言都有支持可变长度(正和负)lookahead但不支持可变长度lookbehind的正则表达式引擎。这包括PHP,Perl,Python(标准正则表达式引擎),R,Ruby和Java。结果是,如果认为代码可能从C移植到不同的语言,则会建议使用前瞻解决方案。
我不能说消极的前瞻是否会比积极的前瞻更有效。

相关问题