正则表达式查找行中没有任何其他非 space 字符的文本
Regex to find text not preceded by any other non-space character(s) on line
我正在遍历文本文件中的行,并想检测这样一行文本:
See Also: something.m, something_else.m
关键是See Also
部分
See Also
不区分大小写
See Also
前面可以有空格
See Also
后面可以跟空格
See Also
前面不能有任何其他非空白文本,例如我希望 foobar blahblah See Also
无法匹配。我不希望 See Also
之前的行中有任何内容,除了空格
See Also
可以选择后跟一个分号 ':',然后是更多空格
See Also
或 See Also:
或 See Also :
等可以选择在空格后跟更多文本,前提是 [=51= 后至少有一个空格字符] 或 ':'
我有大部分正则表达式,问题是检测 See Also
之前是否有文本。下面是我的尝试(在 matlab/Octave 代码中)。但是,它支持标准正则表达式(据我所知),包括先行和后行。
[start_idx, end_idx, extents, match] = ...
regexp ('See Also ', '(?<!\S*)\s*See\sAlso\s*[:]?\s*(\s[A-Za-z0-9_\.]*)?\s*$', 'ignorecase', 'once')
所以实际的正则表达式尝试是
(?<!\S*)\s*See\sAlso\s*[:]?\s*(\s[A-Za-z0-9_\.]*)?\s*$
以上不匹配See Also
任何人都可以提出问题吗?
我想是因为你不能拥有quantifier in the negative lookbehind.
您可以在字符 class 中添加一个空格和一个逗号,并将 [A-Za-z0-9_]
替换为 \w
。
例如:
下面的模式使用 mi
标志(在全局 g
标志之上)
^[ \t]*see also[ \t]*:?[ \t]+(.*)
^
在行首声明位置
[ \t]*
匹配任意数量的 space 或制表符
see also
按字面匹配(i
不区分大小写的标志匹配模式中字母的大写变体)
[ \t]*
匹配任意数量的 space 或制表符
:?
可选地按字面匹配 :
[ \t]+
匹配一个或多个 space 或制表符
(.*)
任意次数捕获任何字符到捕获组 1
编辑
正如评论中指出的那样,字符串 see also :something.m, something_else.m
不应被模式捕获(冒号后缺少 space)。下面的模式纠正了这个问题。
^[ \t]*see also(?:[ \t]*:)?+[ \t]+(.*)
(?:[ \t]*:)?+
可选择在引擎回溯时不放弃匹配(占有)
我正在遍历文本文件中的行,并想检测这样一行文本:
See Also: something.m, something_else.m
关键是See Also
部分
See Also
不区分大小写See Also
前面可以有空格See Also
后面可以跟空格See Also
前面不能有任何其他非空白文本,例如我希望foobar blahblah See Also
无法匹配。我不希望See Also
之前的行中有任何内容,除了空格See Also
可以选择后跟一个分号 ':',然后是更多空格See Also
或See Also:
或See Also :
等可以选择在空格后跟更多文本,前提是 [=51= 后至少有一个空格字符] 或 ':'
我有大部分正则表达式,问题是检测 See Also
之前是否有文本。下面是我的尝试(在 matlab/Octave 代码中)。但是,它支持标准正则表达式(据我所知),包括先行和后行。
[start_idx, end_idx, extents, match] = ...
regexp ('See Also ', '(?<!\S*)\s*See\sAlso\s*[:]?\s*(\s[A-Za-z0-9_\.]*)?\s*$', 'ignorecase', 'once')
所以实际的正则表达式尝试是
(?<!\S*)\s*See\sAlso\s*[:]?\s*(\s[A-Za-z0-9_\.]*)?\s*$
以上不匹配See Also
任何人都可以提出问题吗?
我想是因为你不能拥有quantifier in the negative lookbehind.
您可以在字符 class 中添加一个空格和一个逗号,并将 [A-Za-z0-9_]
替换为 \w
。
例如:
下面的模式使用 mi
标志(在全局 g
标志之上)
^[ \t]*see also[ \t]*:?[ \t]+(.*)
^
在行首声明位置[ \t]*
匹配任意数量的 space 或制表符see also
按字面匹配(i
不区分大小写的标志匹配模式中字母的大写变体)[ \t]*
匹配任意数量的 space 或制表符:?
可选地按字面匹配:
[ \t]+
匹配一个或多个 space 或制表符(.*)
任意次数捕获任何字符到捕获组 1
编辑
正如评论中指出的那样,字符串 see also :something.m, something_else.m
不应被模式捕获(冒号后缺少 space)。下面的模式纠正了这个问题。
^[ \t]*see also(?:[ \t]*:)?+[ \t]+(.*)
(?:[ \t]*:)?+
可选择在引擎回溯时不放弃匹配(占有)