为什么这个 (?=^\s*)print_debug 正前瞻与 \s* 空格不匹配?
Why this (?=^\s*)print_debug positive lookahead is not matching the \s* spaces?
为什么这个 (?=^\s*)print_debug
正先行不匹配 \s*
空格?
完整的正则表达式模式是 (?=^\s*)print_debug
。样本匹配为:
print_debug('scroll set: '+str(position));
print_debug('scroll set: '+str(position));
print_debug('scroll set: '+str(position));
print_debug('supposed current scroll: '+str(view.viewport_position())); # THIS LIES
else:
print_debug('SKIPPED...')
但是它只匹配前两行:
这是在线正则表达式引擎的link:
为什么 \s*
在与 ^
一起使用时被忽略?
- 如果删除
^
,\s*
开始匹配。
- 如果添加
^
,\s*
将停止工作。
我希望它在 Sublime Text
上使用并禁用我的 Python
Sublime Text 包源代码文件中的所有调试语句。
我相信实际上是你的积极前瞻把事情搞砸了,而不是 ^
。我认为你真正想要的是一个原子组(http://www.regular-expressions.info/atomic.html):
(?>^\s*)print_debug
这在每一行都显示了对我的匹配(我什至在 Sublime 中测试过它)。
(?=^\s*)print_debug
表示匹配的位置不仅要匹配print_debug
,还要匹配^\s*
.
匹配的位置是一个"print_debug"的开头和一行的开头,可选白色space。所以只有行首的 "print_debug" 匹配。
如果您想确保 print_debug
之前 只有白色 space,您应该改用后视:(?<=^\s*)print_debug
根本原因
(?=^\s*)
是一个 positive lookahead 匹配行的开始(在 SublimeText 中, ^
默认匹配行开始),然后是 0+ 个空格(即 \s*
根本不必匹配 任何 文本!)。
因此,您的 (?=^\s*)print_debug
模式匹配 print_debug
如果它位于字符串的开头(注意 (?!^)
与 (?<!^)
的工作方式相同,因为 ^
是一个零宽度断言)。
解决方案
由于 SublimeText 正则表达式中没有可变宽度 lookbehind 支持,您可以利用 \K
匹配重置运算符 :
^\s*\Kprint_debug
详情:
^
- 行首
\s*
- 零个或多个空格(可以替换为 \h*
以仅匹配水平空格)
\K
- 省略到目前为止匹配的整个文本
print_debug
- 文字字符串。
为什么这个 (?=^\s*)print_debug
正先行不匹配 \s*
空格?
完整的正则表达式模式是 (?=^\s*)print_debug
。样本匹配为:
print_debug('scroll set: '+str(position));
print_debug('scroll set: '+str(position));
print_debug('scroll set: '+str(position));
print_debug('supposed current scroll: '+str(view.viewport_position())); # THIS LIES
else:
print_debug('SKIPPED...')
但是它只匹配前两行:
这是在线正则表达式引擎的link:
为什么 \s*
在与 ^
一起使用时被忽略?
- 如果删除
^
,\s*
开始匹配。 - 如果添加
^
,\s*
将停止工作。
我希望它在 Sublime Text
上使用并禁用我的 Python
Sublime Text 包源代码文件中的所有调试语句。
我相信实际上是你的积极前瞻把事情搞砸了,而不是 ^
。我认为你真正想要的是一个原子组(http://www.regular-expressions.info/atomic.html):
(?>^\s*)print_debug
这在每一行都显示了对我的匹配(我什至在 Sublime 中测试过它)。
(?=^\s*)print_debug
表示匹配的位置不仅要匹配print_debug
,还要匹配^\s*
.
匹配的位置是一个"print_debug"的开头和一行的开头,可选白色space。所以只有行首的 "print_debug" 匹配。
如果您想确保 print_debug
之前 只有白色 space,您应该改用后视:(?<=^\s*)print_debug
根本原因
(?=^\s*)
是一个 positive lookahead 匹配行的开始(在 SublimeText 中, ^
默认匹配行开始),然后是 0+ 个空格(即 \s*
根本不必匹配 任何 文本!)。
因此,您的 (?=^\s*)print_debug
模式匹配 print_debug
如果它位于字符串的开头(注意 (?!^)
与 (?<!^)
的工作方式相同,因为 ^
是一个零宽度断言)。
解决方案
由于 SublimeText 正则表达式中没有可变宽度 lookbehind 支持,您可以利用 \K
匹配重置运算符 :
^\s*\Kprint_debug
详情:
^
- 行首\s*
- 零个或多个空格(可以替换为\h*
以仅匹配水平空格)\K
- 省略到目前为止匹配的整个文本print_debug
- 文字字符串。