我正在尝试提取
下面的部分字符串我试过(。*)(?:table)?,它在最后一种情况下失败了。如何在没有文本“table”的情况下使表达式捕获整个字符串
答案 0 :(得分:2)
您应该执行删除文本table
的替换操作,而不是尝试匹配table
以外的所有内容。
根据语言的不同,这可能甚至不需要正则表达式。例如,在Java中,您可以使用:
String output = input.replace("table", "");
答案 1 :(得分:1)
(.*)(?:table)?
以table
(匹配)失败,因为第一组(.*)
是贪婪点匹配模式,将整个字符串抓取到第1组。正则表达式引擎回溯并在可选的非捕获组中查找table
,并匹配字符串末尾的空字符串。
正则表达式技巧是在可选组之前匹配任何不以table
开头的文字:
^((?:(?!table).)+)(?:table)?$
现在,第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