使用正则表达式提取字符串的一部分

时间:2016-08-12 06:02:18

标签: regex

我正在尝试提取

下面的部分字符串

我试过(。*)(?:table)?,它在最后一种情况下失败了。如何在没有文本“table”的情况下使表达式捕获整个字符串

  1. 文字:“餐桌”预计比赛:餐饮
  2. 文字:“烹饪”匹配:烹饪
  3. 文字:“烹饪”比赛:烹饪
  4. 文字:“表格”匹配:“”

4 个答案:

答案 0 :(得分:2)

您应该执行删除文本table的替换操作,而不是尝试匹配table以外的所有内容。

根据语言的不同,这可能甚至不需要正则表达式。例如,在Java中,您可以使用:

String output = input.replace("table", "");

答案 1 :(得分:1)

(.*)(?:table)?table(匹配)失败,因为第一组(.*)贪婪点匹配模式,将整个字符串抓取到第1组。正则表达式引擎回溯并在可选的非捕获组中查找table,并匹配字符串末尾的空字符串。

enter image description here

正则表达式技巧是在可选组之前匹配任何不以table 开头的文字:

^((?:(?!table).)+)(?:table)?$

请参阅the regex demo

现在,第1组 - ((?:(?!table).)+) - 包含tempered greedy token (?:(?!table).)+,其匹配除了不启动table序列的换行符之外的1个或多个字符。因此,第一组永远不会匹配table

锚点使正则表达式匹配整行。

注意:非正则表达式解决方案可能会变得更有效率,因为缓和的贪婪令牌相当耗费资源。

NOTE2 :展开淬火贪婪令牌通常会提高n次性能:

^([^t]*(?:t(?!able)[^t]*)*)(?:table)?$

请参阅another demo

但通常看起来很神秘","不可读"和"不可维护"。

答案 2 :(得分:1)

如果你想使用正则表达式,你可以使用这个:

(^.*)(?=table)|(?!.*table.*)(^.+)

在此处查看演示:regex101

这个想法是:匹配从行^的开头到单词table的所有内容,或者如果在字符串中找不到表,则匹配至少一个符号。 (避免匹配空行)。因此,当它找到单词表时,它将返回一个空字符串(因为它从行的开头到字表匹配)。

答案 3 :(得分:1)

尽管有其他很好的答案,你也可以使用替换:

^(?|(.*)table$|(.*))$

这会使用分支重置,因此您所需的内容始终存储在第1组中。如果您选择的语言/工具不支持,则必须检查第1组和第2组中的哪一个包含字符串。

请参阅Demo