我正在尝试创建一个正则表达式,该文本可以匹配20个单词以内的文本中的4个单词,并且它们也应顺序排列
对于10个单词范围内的2个单词,我可以使用以下内容
"\b(?:word1\W+(?:\w+\W+){0,10}?word2"
但无法匹配4个单词,因此需要寻找建议。
示例:
样本,常规,验证,转换-以下文本中20个词中应包含这4个词
这是示例正则表达式文本。正则表达式用于字符串验证,解析和转换。术语“正则表达式”通常缩写为“ RegEx”或“ regex”。
谢谢。
答案 0 :(得分:1)
假设您要在第一个字和最后一个字之间最多输入20个字,总共22个字。
您可以做的是检查第一个单词和最后一个单词是否在所需单词距离之内,并在第一个单词之后使用lookahead (?=...)
以按所需顺序检查两个中间单词,同时不跳过最后一个单词否定的(?!...)
来表示单词。
/\b(sample)\W+ # first word (group 1)
(?= # look ahead
(?:(?!(?4))\w+\W+)*?(regular)\W+ # for word 2 (group 2)
(?:(?!(?4))\w+\W+)*?(validation) # for word 3 (group 3)
) # eof lookahead
(?:\w+\W+){0,20}?(transformation\b) # last word (group 4)
/ix
在this pcre demo at regex101中,我放置了一些capture groups以突出显示匹配的单词,并在最后一个单词模式中使用了pattern reference (?4)
以缩短正则表达式。
使用了flags i (case insensitive)
,x (free spacing/comment mode)
您可以通过dropping the capturing groups and reference来提高性能。仅仅删除引用也将使该模式与Java等其他正则表达式样式更加兼容。
如果您使用的是PHP,并且只想检查4个单词是否在所需范围内,则还可以使用更简单的正则表达式并用str_word_count()
来计数单词。
$pattern = '/\bsample\b.*?\bregular\b.*?\bvalidation\b.*?\btransformation\b/is';
if(preg_match($pattern, $str, $out) && (str_word_count($out[0]) <= 22))
{ /* do something */ }