我尝试匹配百分比的所有示例(例如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正则表达式引擎。
2条答案
按热度按时间kknvjkwl1#
在模式
(?<=Discount)*(\d+%)+
中,您可以选择重复一个lookbehindAssert,该Assert仅在 * 当前位置 * 的正左侧Assert单词“Discount”,因此0次也足够了,您将匹配所有出现的(\d+%)+
如果您只需要一个值,则不需要捕获组,因为此模式
(\d+%)+
重复1+乘以1+位数,并且%
为了只获取一个值,你可以这样写模式,并使用单词边界来防止部分单词匹配:
字符串
模式匹配:
(?<=
正向后查找Assert\bDiscount\b.*
匹配单词“Discount”后跟0+次除换行符以外的任何字符(因为在“Discount”和\d+%
模式之间还有其他字符))
关闭查找\b
A字边界\d+%
匹配1+次any digit和%
Regex demo的
在.NET中,您还可以使用Group.Captures属性来使用重复捕获组
型
Regex demo的
uxhixvfz2#
你可以使用(可变长度)负前看,而不是像Bird #4那样使用(可变长度)正后看:
字符串
Demo
正则表达式可以分解如下。
型
请注意,C是支持可变长度(正和负)lookbehind的少数语言之一。大多数主流语言都有支持可变长度(正和负)lookahead但不支持可变长度lookbehind的正则表达式引擎。这包括PHP,Perl,Python(标准正则表达式引擎),R,Ruby和Java。结果是,如果认为代码可能从C移植到不同的语言,则会建议使用前瞻解决方案。
我不能说消极的前瞻是否会比积极的前瞻更有效。