我有以下正则表达式,从字符串中找到发票编号。
(?: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
先谢谢。
答案 0 :(得分:3)
.*(?=(?:invoice)([?:#\- ]*)(\d+))|(?<=(?:invoice)([?:#\- ]*)(\d+))[ ].*
Regex Demo - Negate Invoice String
对于匹配发票字符串的正则表达式:
(?:invoice)(?:#\s|:|#|\s*|-|\s:|\s#|\s-\s|\s#\s|\s\()(\d+)
您可以简化为:(?:invoice)([?:#\- ]*)(\d+)
答案 1 :(得分:1)
您可以尝试使用以下模式进行匹配:
^(.*?invoice[^0-9]*)\d+(.*)$
然后用第一个和第二个捕获组替换:
$1$2
您从未告诉我们您使用的语言/工具,但此方法适用于大多数语言和工具,例如Java或Notepad ++。
修改强>
实际上可以在不使用捕获组的情况下在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