正则表达式仅在没有前面的情况下才替换

标签 regex

为我对正则表达式的公然缺乏知识表示歉意,我知道这里出现了很多问题,但我可能会连续几个小时尝试,但我无法弄清楚这一点。
基本上我想要做的是替换字符串中所有出现的 6 位数字(带或不带连字符)。但是,如果前面有某些单词,我不希望替换数字。

这个 Regular expression to match a line that doesn't contain a word? 解决方案接近我正在寻找的解决方案,但我似乎无法以适合我的要求的方式使用它。

我需要的是如下:
对于字符串:

“用户在 23/05/14 向账户 123456 支付了 43 英镑,支票 123456 交易:123456。”

我只想替换前面没有“支票”或“交易:”的 6 位数字。我一直在尝试如下:

\b[0-9]{2}-?[0-9]{2}-?[0-9]{2}\b 

(这将替换所有 6 位数字)

使用这个 How do you replace a match, using regex, only if it is not preceded by a given character? 答案,我试过了
(^cheque\s[0-9]{2}-?[0-9]{2}-?[0-9]{2}\b) 

(请注意,我首先尝试使用我希望转义的词之一,然后再包含其他词。)
这不会替换任何 6 位数字。

通过反复试验,我发现
(cheque\s+[0-9]{2}-?[0-9]{2}-?[0-9]{2}\b) 

将替换单词 check 后跟一个 6 位数字,所以我到达那里 - 但我需要否定这个(和交易后跟 6 位数字)并替换前面没有这些单词的 6 位数字。

这个 How to negate the whole regex? 答案有助于弄清楚如何否定表达式,但尽我所能,我找不到如何使它适合我的情况。我试过
^(?!(?:((transaction\s+[0-9]{2}-?[0-9]{2}-?[0-9]{2}\b) )|((cheque\s+[0-9]{2}-?[0-9]{2}-?[0-9]{2}\b) ))$).*$

但这取代了整个字符串!

非常感谢您对此的任何帮助。

感谢您。

最佳答案

尝试这个:

(?<!(?:cheque|transaction:)\s*)\d{2}-?\d{2}-?\d{2}\b

解释:
  • (?<! ... )否定的后视断言(匹配任何不在此之前的内容)
  • (?:cheque|transaction:)\s*非捕获组“支票”或“交易:”后跟任意数量的空格
  • \d{2}-?\d{2}-?\d{2}\b六位数字可能是连字符,以字边界结尾
  • 关于正则表达式仅在没有前面的情况下才替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28947678/

    相关文章:

    regex - 来自 txt 文件中列的 GREP 值

    regex - 第一个字符是字母的正则表达式是什么?

    c# - 如何使用 .NET XML 序列化序列化正则表达式类型

    javascript - 正则表达式允许以全名形式并以字母开头的任何语言字符

    php - 正则表达式不能正确处理土耳其字符

    Java 正则表达式 unicode 支持?

    java - 当字符串以 &*( 开头并以 )(* 结尾时,如何从字符串中删除一部分文本

    sql - 正则表达式填充零

    javascript - 用正则表达式替换文本

    regex - 在 JSP EL 中使用正则表达式