正则表达式查找行中没有任何其他非 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部分

  1. See Also 不区分大小写
  2. See Also 前面可以有空格
  3. See Also后面可以跟空格
  4. See Also 前面不能有任何其他非空白文本,例如我希望 foobar blahblah See Also 无法匹配。我不希望 See Also 之前的行中有任何内容,除了空格
  5. See Also 可以选择后跟一个分号 ':',然后是更多空格
  6. See AlsoSee 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

例如:

^\s*See\sAlso\s*:?\s*(\s[\w., ]*)?\s*$

下面的模式使用 mi 标志(在全局 g 标志之上)

See code in use here

^[ \t]*see also[ \t]*:?[ \t]+(.*)
  • ^ 在行首声明位置
  • [ \t]* 匹配任意数量的 space 或制表符
  • see also 按字面匹配(i 不区分大小写的标志匹配模式中字母的大写变体)
  • [ \t]* 匹配任意数量的 space 或制表符
  • :? 可选地按字面匹配 :
  • [ \t]+ 匹配一个或多个 space 或制表符
  • (.*) 任意次数捕获任何字符到捕获组 1

编辑

正如评论中指出的那样,字符串 see also :something.m, something_else.m 不应被模式捕获(冒号后缺少 space)。下面的模式纠正了这个问题。

See regex in use here

^[ \t]*see also(?:[ \t]*:)?+[ \t]+(.*)
  • (?:[ \t]*:)?+ 可选择在引擎回溯时不放弃匹配(占有)