R 使用括号时正则表达式不一致
有谁能帮助我理解为什么会出现以下情况:R 使用括号时正则表达式不一致,r,regex,R,Regex,有谁能帮助我理解为什么会出现以下情况: require(stringr) x = "The quick brown fox jumps over the lazy dog" str_detect(x, 'dog') #> [1] TRUE str_detect(x, '(?=dog)') #> [1] TRUE str_detect(x, '(?=quick)(?=dog)') # fails why? #> [1] FALSE str_detect(x, '(?=quick)
require(stringr)
x = "The quick brown fox jumps over the lazy dog"
str_detect(x, 'dog')
#> [1] TRUE
str_detect(x, '(?=dog)')
#> [1] TRUE
str_detect(x, '(?=quick)(?=dog)') # fails why?
#> [1] FALSE
str_detect(x, '(?=quick)(?=.*dog)')
#> [1] TRUE
从前面看,向前看,向后看:
是零长度断言;它们不使用中的字符
字符串,但仅断言匹配是否可能
因此正则表达式(?=quick)(?=dog)
将首先与(?=quick)
匹配:
由于它不使用字符,所以在匹配后,位置保持在quick之前,并继续匹配下一个模式(?=dog)
,该模式失败,因为这不是真的,实际上,您将永远找不到紧跟着quick
和dog
的位置
如果其中一个模式是另一个模式的前缀,例如quick
和qui
,您会发现这是有效的:
x = "The quick brown fox jumps over the lazy dog"
str_detect(x, '(?=quick)(?=qui)')
# [1] TRUE
(?=quick)(?=.*dog)
另一方面,尝试在匹配后的位置查找(?=.*dog)
:
它断言TRUE
,因为quick brown fox跳过了懒狗
,可以匹配*狗
,向前看和向后看:
是零长度断言;它们不使用中的字符
字符串,但仅断言匹配是否可能
因此正则表达式(?=quick)(?=dog)
将首先与(?=quick)
匹配:
由于它不使用字符,所以在匹配后,位置保持在quick之前,并继续匹配下一个模式(?=dog)
,该模式失败,因为这不是真的,实际上,您将永远找不到紧跟着quick
和dog
的位置
如果其中一个模式是另一个模式的前缀,例如quick
和qui
,您会发现这是有效的:
x = "The quick brown fox jumps over the lazy dog"
str_detect(x, '(?=quick)(?=qui)')
# [1] TRUE
(?=quick)(?=.*dog)
另一方面,尝试在匹配后的位置查找(?=.*dog)
:
它断言
TRUE
,因为quick brown fox跳过了懒狗
可以匹配*dogLookaheads,比如(?=quick)
在lookahead中的内容之前匹配。(?=quick)
匹配的点后面不紧跟着狗。你想让你的正则表达式是什么意思?你想在逻辑上断言dog
出现在quick
'(?=quick)(?=quick.*dog)
=(?=quick.*dog)
lookahead类似于(?=quick)
的内容前面匹配。(?=quick)
匹配的点后面不紧跟着狗。你想要你的正则表达式是什么意思?你的第四个正则表达式是你想要逻辑地断言dog
出现在quick
'(?=quick)(?=.*dog)
=='(?=quick.*dog)
。我正在努力实现一个和声明,所以这是有效的。谢谢你。我正在尝试实现一个AND语句,这样它就可以工作了。
The quick brown fox jumps over the lazy dog
^^ # this position