为我对正则表达式的公然缺乏知识表示歉意,我知道这里出现了很多问题,但我可能会连续几个小时尝试,但我无法弄清楚这一点。
基本上我想要做的是替换字符串中所有出现的 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/