正则表达式仅在不靠近行首时才匹配
RegEx match only if not near beginning of line
对于正则表达式,我想使用否定后视来匹配不在行首附近的模式。这是为了匹配其他文本之后的 VHDL 注释,而不是行首附近的注释(即除了空格之外没有其他文本)。
例如,如果我的测试字符串是:
-- BOL
test; -- C1
test => -- C1
-- BOL indent
我想要一个正则表达式字符串:
(?<!^\s*)--
只匹配两个"C1"前面的“--”,忽略"BOL"和"BOL indent"前面的“--”。
但这需要可变长度的后视,这在这个正则表达式工具中不受支持。问题源于事先不知道缩进有多少个空格。
有更好的方法吗?
一个选项是从字符串的开头匹配 0+ 个空白字符,然后至少匹配不是 -
的非空白字符。然后在一组
中的字符串中进一步捕获--
^[^\S\r\n]*[^\s-].*(--)
我假设您希望匹配 '--'
以及行或字符串中的所有内容,前提是 '--'
前面有一个非空白字符。
在对正则表达式引擎支持的问题的评论中指出 \K
。 \K
导致正则表达式引擎丢弃当前匹配中的所有内容并将匹配的起点重置为字符串中的当前位置。
\S.*\K--.*
我使用支持 \K
的 PCRE (PHP) 正则表达式引擎对此进行了测试。 Demo
如果您不想在匹配中包含 '--'
,请使用 \S.*--\K.*
或 \S.*--\s*\K.*
。
对于正则表达式,我想使用否定后视来匹配不在行首附近的模式。这是为了匹配其他文本之后的 VHDL 注释,而不是行首附近的注释(即除了空格之外没有其他文本)。
例如,如果我的测试字符串是:
-- BOL
test; -- C1
test => -- C1
-- BOL indent
我想要一个正则表达式字符串:
(?<!^\s*)--
只匹配两个"C1"前面的“--”,忽略"BOL"和"BOL indent"前面的“--”。 但这需要可变长度的后视,这在这个正则表达式工具中不受支持。问题源于事先不知道缩进有多少个空格。
有更好的方法吗?
一个选项是从字符串的开头匹配 0+ 个空白字符,然后至少匹配不是 -
的非空白字符。然后在一组
--
^[^\S\r\n]*[^\s-].*(--)
我假设您希望匹配 '--'
以及行或字符串中的所有内容,前提是 '--'
前面有一个非空白字符。
在对正则表达式引擎支持的问题的评论中指出 \K
。 \K
导致正则表达式引擎丢弃当前匹配中的所有内容并将匹配的起点重置为字符串中的当前位置。
\S.*\K--.*
我使用支持 \K
的 PCRE (PHP) 正则表达式引擎对此进行了测试。 Demo
如果您不想在匹配中包含 '--'
,请使用 \S.*--\K.*
或 \S.*--\s*\K.*
。