正则表达式查找

时间:2018-01-18 15:11:42

标签: regex matlab octave

我正在循环文本文件中的行,并想要检测一行文本:

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无法匹配。除了空格
  5. 之外,我不希望在See Also之前有任何内容
  6. See Also可以选择后跟分号':'然后是更多的空格
  7. See Also,或See Also:See Also :等可以选择在空格后跟随更多文字,只要在'o'或'后面至少有一个空白字符: “
  8. 我有大部分正则表达式,问题是检测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任何人都可以提出问题吗?

2 个答案:

答案 0 :(得分:1)

我认为这是因为你不能拥有quantifier in the negative lookbehind

您可以在角色类中添加空格和逗号,并将[A-Za-z0-9_]替换为\w

例如:

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

答案 1 :(得分:1)

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

See code in use here

^[ \t]*see also[ \t]*:?[ \t]+(.*)
  • ^在行首处断言位置
  • [ \t]*匹配任意数量的空格或制表符
  • see also按字面意思匹配(i标志不区分大小写匹配模式中字母的大写变体)
  • [ \t]*匹配任意数量的空格或制表符
  • :?可选择与:字面匹配
  • [ \t]+匹配一个或多个空格或制表符
  • (.*)将任意字符捕获到捕获组1

修改

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

See regex in use here

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