匹配字符串并否定结果

时间:2018-02-07 04:35:51

标签: regex

我有以下正则表达式,从字符串中找到发票编号。

(?:invoice)(?:#\s|:|#|\s*|-|\s:|\s#|\s-\s|\s#\s|\s\()(\d+)

示例数据:

ABC invoice#123456 this is an invoice
ABC invoice-123456 this is an invoice
ABC invoice 123456 this is an invoice

正则表达式处理不同的格式并且工作正常。 我想做的是否定发票号并返回其他所有内容。

甚至可能吗?例如,正则表达式应返回没有发票号的后续文本。

ABC invoice# this is an invoice
ABC invoice- this is an invoice
ABC invoice  this is an invoice

先谢谢。

2 个答案:

答案 0 :(得分:3)

.*(?=(?:invoice)([?:#\- ]*)(\d+))|(?<=(?:invoice)([?:#\- ]*)(\d+))[ ].*

Regex Demo - Negate Invoice String

对于匹配发票字符串的正则表达式:

(?:invoice)(?:#\s|:|#|\s*|-|\s:|\s#|\s-\s|\s#\s|\s\()(\d+)

您可以简化为:(?:invoice)([?:#\- ]*)(\d+)

Regex Demo - Invoice String

答案 1 :(得分:1)

您可以尝试使用以下模式进行匹配:

^(.*?invoice[^0-9]*)\d+(.*)$

然后用第一个和第二个捕获组替换:

$1$2

您从未告诉我们您使用的语言/工具,但此方法适用于大多数语言和工具,例如Java或Notepad ++。

Regex101

修改

实际上可以在不使用捕获组的情况下在Java中进行此替换。相反,我们可以使用前瞻来确定要删除的发票号码:

String input = "ABC invoice#123456 this is an invoice";
input = input.replaceAll("(?<=invoice.)\\d+(?=\\s)", "");
System.out.println(input);

ABC invoice# this is an invoice

Demo